Elasticsearch查询分词问题

问题描述

在Elasticsearch中,当我们没有设置mapping的情况下,插入一条记录字符串类型的被默认指定为text类型,text类型在Elasticsearch是会被分词的. 比如你插入一个名字为(wxx wxx)的记录,那么当你检索(name:wxx)的时候,这条记录是会被检索到的; 再比如你插入的记录地址为(address:江西抚州市),那么当你按照地址(address:江西抚州市)去检索,你会发现你查询不出这条记录,这是因为你的address字段默认分词检索的.这两种情况,一种查询多了,一种一条记录没检出,都是因为分词导致的.

案例说明

//插入测试数据1
POST index3/_doc
{
  "name": "wxx wxx",
  "address": "江西抚州",
  "age": 28,
  "hobbby": [
    "工作"
  ],
  "sex": "man"
}
//插入测试数据2
POST index3/_doc
{
  "name": "wxx",
  "address": "江西抚州",
  "age": 28,
  "hobbby": [
    "工作"
  ],
  "sex": "man"
}

//查询语句--检索name=wxx,发现两条都能被检索到
GET index3/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "name": "wxx"
        }
      }
    }
  }
}
//查询语句--检索address=江西抚州,发现一条都解决不了
GET index3/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "address": "江西抚州"
        }
      }
    }
  }
}
复制代码

疑惑解答

//分词分析语句
POST index3/_analyze
{
  "field": "name",
  "text": "wxx wxx"
}

POST index3/_analyze
{
  "field": "address",
  "text": "江西抚州"
}
复制代码

image.png

image.png

说明:通过分词,我们发现,默认情况下,只检索分词倒排索引关联的数据

//分词分析语句
POST index3/_analyze
{
  "field": "name.keyword",
  "text": "wxx wxx"
}

POST index3/_analyze
{
  "field": "address.keyword",
  "text": "江西抚州"
}
复制代码

说明:我们只要不以默认分词的倒排索引去检测,而是当作一个keyword(比较新版本支持)去关联对应数据即可

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享