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