我的UI上有很多文档过滤器(日期范围、复选框、输入字段),所以查询是动态生成的--这就是为什么我决定创建一个布尔查询,并将所有内容推送到must数组。下面是我的请求示例:
const {
body: {
hits
}
} = await esclient.search({
from: filterQuery.page || 0,
size: filterQuery.limit || 1000,
index,
body: query
});复选框(我在must数组中使用了额外的bool.should )和日期范围可以很好地工作,但术语/匹配过滤根本不起作用:
{
"query": {
"bool": {
"must": [
{"match": { "issueNumber": "TEST-10" }}
]
}
}
} 上面的查询给出了包含"TEST“的索引中的所有文档(以及它们的分数),如果我将match更改为term,它将返回一个空数组。
因为我的字段类型是'text',所以我也尝试了filter查询- ES仍然给出了所有带有'TEST‘单词的文档:
{
"query": {
"bool": {
"must": [
{
"bool": {
"filter": {
"match": {"issueNumber": "TEST-10"}
}
}
}
]
}
}
} 我的点击率是这样的:
{
"_index" : "test_elastic",
"_type" : "_doc",
"_id" : "bj213hj2gghg213",
"_score" : 0.0,
"_source" : {
"date" : "2019-11-26T13:27:01.586Z",
"country" : "US",
"issueNumber" : "TEST-10",
}有人能告诉我如何在复杂查询中正确过滤文档吗?
这是我的索引的结构:
{
"test_elasticsearch" : {
"aliases" : { },
"mappings" : {
"properties" : {
"country" : {
"type" : "text"
},
"date" : {
"type" : "date"
},
"issueNumber" : {
"type" : "text"
}
}
},
"settings" : {
"index" : {
"creation_date" : "1574759226800",
"number_of_shards" : "1",
"number_of_replicas" : "1",
"uuid" : "PTDsdadasd-ERERER",
"version" : {
"created" : "7040299"
},
"provided_name" : "logs"
}
}
}
}发布于 2019-11-27 15:20:28
好的,问题是你的issueNumber字段没有正确的类型,如果你的目标是对它进行精确的搜索,它应该是keyword而不是text。country也是如此。如下所示修改映射:
"properties" : {
"country" : {
"type" : "keyword"
},
"date" : {
"type" : "date"
},
"issueNumber" : {
"type" : "keyword"
}
}然后重新索引您的数据,您的查询就可以工作了。
https://stackoverflow.com/questions/59064728
复制相似问题