使用范围过滤器和内部字段的未知名称在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的第一个解决方案简短而强大。