es keyword和text的区别以及联想词实现方案

526 阅读1分钟

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