码迷,mamicode.com
首页 > 其他好文 > 详细

ElasticSearch——分词

时间:2019-11-04 13:55:51      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:racket   cse   类型   ext   mamicode   strong   arch   空间   进阶   

 

前言:

最近在使用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
      }
  }
}

 

 

 

 

ElasticSearch——分词

标签:racket   cse   类型   ext   mamicode   strong   arch   空间   进阶   

原文地址:https://www.cnblogs.com/caoweixiong/p/11791238.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!