``
使用term查询搜索文档时,参数正确却无结果返回的情况。
提示:以下是本篇文章正文内容,下面案例可供参考
term查询是一种最基本的查询类型之一,用于精确匹配一个特定的词项。当使用term搜索索引中包含该词项的文档时不会对查询字符串进行任何处理(分析)。
注意:使用term查询只能匹配完全相同的词项,而不能匹配相似的词项。
term查询类似于使用MySql数据库查询使用的where,如下
"term": {
"province": {
"value": "北京"
}
}
#相当于 where province = "北京"
#而terms相当于 where province = "北京" OR province = "上海"
"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" : [ ]
}
}
使用该字段的关键字(keyword)子字段进行查询:
注意:keyword字段不会进行分词或分析,而是将整个字符串作为一个词条来进行索引和搜索。
"term": {
"province.keyword": {
"value": "北京"
}
}
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查询仅能返回与查询匹配的索引中的文档。请确保您的查询涵盖了正确的索引。
每天学一点,每天进步一点!初次写,不正确的地方,欢迎指正。