【ES的term查询无返回结果】

ElasticSearch查询之term


前言

``

使用term查询搜索文档时,参数正确却无结果返回的情况。


提示:以下是本篇文章正文内容,下面案例可供参考

一、term与terms

term查询是一种最基本的查询类型之一,用于精确匹配一个特定的词项。当使用term搜索索引中包含该词项的文档时不会对查询字符串进行任何处理(分析)

注意:使用term查询只能匹配完全相同的词项,而不能匹配相似的词项。

term查询类似于使用MySql数据库查询使用的where,如下

"term": {
      "province": {
        "value": "北京"
      }
    }
    #相当于 where province = "北京"
    #而terms相当于 where province = "北京" OR province = "上海"

二、问题

1.该字段映射定义

"sms-logs-index" : {
    "mappings" : {
      "sms-logs-type" : {
        "properties" : {
			"province" : {
			            "type" : "text",
			            "fields" : {
			              "keyword" : {
			                "type" : "keyword",
			                "ignore_above" : 256
			              }
			            }
			      }
	     }
    }
  }
}

查询语句:

#term查询
POST /sms-logs-index/sms-logs-type/_search
{
  "from": 0,
  "size": 5,
  "query": {
    "term": {
      "province": {
        "value": "北京"
      }
    }
  }
}

此时执行查询结果为:
可以看到并未返回结果

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 0,
    "max_score" : null,
    "hits" : [ ]
  }
}

2.解决方法

使用该字段的关键字(keyword)子字段进行查询
注意:keyword字段不会进行分词或分析,而是将整个字符串作为一个词条来进行索引和搜索。

"term": {
      "province.keyword": {
        "value": "北京"
      }
    }

结果:
【ES的term查询无返回结果】_第1张图片【ES的term查询无返回结果】_第2张图片此时正确查询,返回结果。

原因

term查询的字段默认情况下是不分析的,而"province" 字段包含两个字段类型定义:一个是 text 类型,一个是 keyword 类型。

由于 province 字段被定义为 text 类型,这将对查询字符串进行分析,并将生成一个或多个词项进行匹配。

这意味着 province 字段的原始值将被分析,并将生成一个或多个词项,而 province.keyword 字段将包含未经过分析的原始值。

总结

所以遇到term查询无返回结果,可先分析该字段索引的映射类型。在kibana中可以使用一下查看字段映射定义。

GET /sms-logs-index/_mapping
#注意sms-logs-index需要更改为你自己的索引

以下为使用term查询数据无返回结果的一部分原因,可以1.根据以下情况分析具体遇到的问题:
查询条件不匹配:使用term查询时,查询条件必须完全匹配才能返回结果。如果查询条件与任何文档的字段值不完全匹配,则不会返回结果。请确保查询条件正确且与文档的字段值匹配。

2.字段类型不正确:term查询仅适用于精确匹配字符串类型的字段。如果字段类型不是字符串类型,则无法使用term查询。如果您的字段类型是数字或日期等其他类型,则应该使用其他类型的查询。

3.数据没有被索引:如果数据没有被正确索引,则查询时不会返回任何结果。请确保您的数据已被正确地索引,以便可以进行查询。

4.索引设置不正确:Elasticsearch允许对每个字段进行不同的索引设置,例如,您可以选择将字段设置为“不分析”或“分析”。如果您的字段被设置为“不分析”,则term查询可能会失败。请确保您的索引设置正确。

5.查询被限制:如果您使用的是安全插件或其他插件,并且查询被限制,则可能无法返回结果。请确保您的查询没有受到任何限制。

6.数据存储在不同的索引中:如果您的数据存储在不同的索引中,则term查询仅能返回与查询匹配的索引中的文档。请确保您的查询涵盖了正确的索引。

每天学一点,每天进步一点!初次写,不正确的地方,欢迎指正。

你可能感兴趣的:(elasticsearch,搜索引擎,json,大数据,java)