Elasticsearch系列——實戰探索text與keyword的區別

Elasticsearch系列——實戰探索text與keyword的區別
原創前方一片光明 最後發佈於2018-08-22 17:36:07 閱讀數 8809  收藏
展開
前言
本文使用的工具是kibana(Linux---Kibana的安裝與測試)

在 elasticsearch2.x 版本,字符串數據只有string類型

ES更新到5版本後,取消了 string 數據類型,代替它的是 keyword 和 text 數據類型

那麼 text 和keyword有什麼區別呢?

我們通過下面的步驟來探索一下:

step1 添加數據
首先,使用bulk往es數據庫中批量添加一些document(關於bulk批量操作的命令,請參考:點我打開鏈接)

POST /book/novel/_bulk
{"index": {"_id": 1}}
{"name": "Gone with the Wind", "author": "Margaret Mitchell", "date": "2018-01-01"}
{"index": {"_id": 2}}
{"name": "Robinson Crusoe", "author": "Daniel Defoe", "date": "2018-01-02"}
{"index": {"_id": 3}}
{"name": "Pride and Prejudice", "author": "Jane Austen", "date": "2018-01-01"}
{"index": {"_id": 4}}
{"name": "Jane Eyre", "author": "Charlotte Bronte", "date": "2018-01-02"}


step2 查看mapping
查看一下mapping

發現name、author的type是text,

還有個field是keyword,keyword的type是keyword:

step3 查詢
我們使用term查詢某個小說:

GET book/novel/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "name": "Gone with the Wind"
        }
      },
      "boost": 1.2
    }
  }
}
結果是什麼也沒有查到:

然後使用name的keyword查詢:

GET book/novel/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "name.keyword": "Gone with the Wind"
        }
      },
      "boost": 1.2
    }
  }
}
可以查詢到一條數據:

step4 實驗
使用name不能查到,而使用name.keyword可以查到,很奇怪呢!

WHY ?
我們可以通過下面的實驗來判斷:

使用name進行分詞的時候,結果會有4個詞出來:

 

使用name.keyword進行分詞的時候,結果只有一個詞出來:

 

結論
1. text類型:會分詞,先把對象進行分詞處理,然後再再存入到es中。

當使用多個單詞進行查詢的時候,當然查不到已經分詞過的內容!

2. keyword:不分詞,沒有把es中的對象進行分詞處理,而是存入了整個對象!

這時候當然可以進行完整地查詢!默認是256個字符!

OK, GAME OVER!
————————————————
版權聲明:本文爲CSDN博主「前方一片光明」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_26230421/article/details/81947517

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章