ElasticSearch——分詞


 

前言:

最近在使用elasticSearch中發現有些數據查不出來,於是研究了一下,發現是分詞導致的,現梳理並總結一下。

 

ElasticSearch 5.0以后,string類型有重大變更,移除了string類型,string字段被拆分成兩種新的數據類型: text用於全文搜索的,而keyword用於關鍵詞搜索

ElasticSearch字符串將默認被同時映射成textkeyword類型,將會自動創建下面的動態映射(dynamic mappings):

"relateId": {  
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
   }
}

這就是造成部分字段還會自動生成一個與之對應的“.keyword”字段的原因。

 

存儲查詢示例:

relateId存儲:20191101R672499460503          1個值 

relateId.keyword存儲:20191101 R 672499460503    3個值

 

這時用relateId進行精確查詢,查不出數據,因為已經被分成3個詞了:

 

用relateId.keyword進行精確查詢則可以查出數據來:

 

 

兩者比較:

Text:默認會分詞,然后進行索引,支持模糊、精確查詢,不支持聚合

keyword:不進行分詞,直接索引,支持模糊、精確查詢,支持聚合

 

進階處理:

注意:Text默認會分詞,這是很智能的,但在有些字段里面是沒用的,所以對於有些字段使用text則浪費了空間。這時可以設置mapping為not analyzied,讓它不分詞。

"relateId": {  
  "type": "text",  
   "index": "not_analyzed"  
}

如果要指定分詞則用下面的方式:

"relateId": {  
  "type": "text",  
   "analyzer": "ik_max_word",
   "search_analyzer":"ik_smart",
   "fields": {
      "keyword": {
         "type": "keyword",
         "ignore_above": 256
      }
  }
}

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM