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" }