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