es keyword和text的區別以及聯想詞實現方案

keyword和text的區別

相同

支持模糊查詢和精確查詢

不同

分詞

keyword 不分詞
text 分詞

聚合查詢

keyword 支持
text 不支持

聯想詞實現方案

內容

基於es的keyword和text來實現
keyword 類型
存儲多個相關關鍵字, 使用間隔符分開, 查詢時使用正則查詢(wildcard)

text 類型
存儲需要分詞的關鍵字, 比如中間可能會帶符號的關鍵詞, 我一般用來存儲需要搜索出來的關鍵字

例子

創建一個索引庫

PUT /xiaofei_test
{
  "mappings": {
    "type":{
      "properties":{
        "key_text": {
          "type": "text"
        },
        "full_word":{
          "type": "keyword"
        }
      }
    }
  }
}

新增一條數據

PUT /xiaofei_test/type/1
{
  "key_text": "新疆•菠蘿密",
  "full_word": "菠蘿 水果 新疆 boluo "
}

然後查詢的dsl語句爲

GET xiaofei_test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "key_text": {
              "query": "菠蘿",
              "slop": 5 
            }
          }
        },
        {
          "wildcard": {
            "full": "*菠蘿*"
          }
        }
      ]
    }
  }
}

text 和slop

slop 的作用是跳詞, 允許中間有一些其他字符
用text的原因就是可能你想搜的關鍵詞裏面會有一些間隔符之類的, text會分詞, 比如說上面的• 之類, 不用text的話我如果要搜 “新疆菠蘿密” 肯定是搜不出來的, text和slop的作用就在此體現

查看分詞結果

POST xiaofei_test/_analyze
{
  "text": "新疆•菠蘿密",
  "field": "key_text"
}

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