ElasticSearch查询时term和match分词与否而导致的大小写问题

环境:ElasticSearch6.5.4版本,kibana6.5.4版本

首先在kibana的Dev Tools中插入几条数据,未制定mapping,则会默认动态映射

POST /stulib/items/_bulk
{"index": {"_id": 1}}
{"age": 11,"stuID": "STUID10010"}
{"index": {"_id": 2}}
{"age": 12,"stuID": "STUID10011"}

查看mapping:

GET /stulib/_mapping

结果:

{
  "stulib" : {
    "mappings" : {
      "items" : {
        "properties" : {
          "age" : {
            "type" : "long"
          },
          "stuID" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
 }}}}}}}}

可观察到stuID使用了分词,意味着stuID的值如果含有大写字母会转换为小写

1.term对搜索词不进行分词分析(大写依然保持大写),与文档中的stuID的值分词后的小写(STUID->stuid)不匹配,因此查不到内容

GET /stulib/items/_search
{ 
  "query": {
    "bool": {
      "filter": [
        {"term": {"stuID": "STUID10010" }}
        ]
    }
  }
}

结果为空

2.match先对搜索词进行分词,分词后大写变小写(STUID->stuid),与文档中的stuID的值分词后的小写(STUID->stuid),恰好匹配,因此可以搜索出结果

GET /stulib/items/_search
{
  "query":{
    "bool":{
      "filter": [
        {"match":  {"stuID": "STUID10010"}}
      ]
    }
  }
}

可查出结果

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "stulib",
        "_type" : "items",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "age" : 11,
          "stuID" : "STUID10010"
        }
      }
    ]
  }
}

 

你可能感兴趣的:(ElasticSearch)