使用范围过滤器和内部字段的未知名称在Elasticsearch中嵌套搜索查询
问题描述:
我正在将数据存储在elasticsearch数据库中,并试图查询它,并按数字范围进行过滤。使用范围过滤器和内部字段的未知名称在Elasticsearch中嵌套搜索查询
这是最小化的文档的结构在我的数据库:
"a": {
"b": {
"x": [1, 2, 3, 4], // note: x, y and z are not compulsory
"y": [2, 3, 4], // some documents can have only x or z or maybe x and z etc.
"z": [5, 6]
}
}
现在,我想我的查询返回的所有文件,其中存在任何“B”的子场中至少一个数字范围在2和4之间。重要的是,我不知道“b”的所有子字段的名称。
我想出了查询:
POST /i/t/_search
{
"query": {
"query_string": {
"fields": ["a.b.*"],
"query": "number:[2 TO 4]"
}
}
}
查询不涨的错误,也没有返回结果。我甚至不确定,哪种搜索查询甚至会最适合这样的任务。我只使用查询字符串,因为它是我发现的唯一一个可以加入未知字段名称和范围的地方。
答
尝试在查询中删除number:
:
{
"query": {
"query_string": {
"fields": ["a.b.*"],
"query": "[2 TO 4]"
}
}
}
可选尝试count:[2 TO 4]
(docs)
另一种类型的查询,允许在田间小路使用通配符*是Multi Match Query但老实说,我不明白如何在你的情况下将它与数字范围结合起来。我唯一想到的是:
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "2",
"fields": ["a.b.*"]
}
},
{
"multi_match": {
"query": "3",
"fields": ["a.b.*"]
}
},
{
"multi_match": {
"query": "4",
"fields": ["a.b.*"]
}
}
]
}
}
}
......这是非常丑陋的。 query_string的第一个解决方案简短而强大。