0

我将数据存储在弹性搜索数据库中,并尝试查询它,按数字范围过滤。

这是我数据库中文档的最小化结构:

"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 之间的数字。重要的是,我不知道“”的所有子字段的名称乙”。

我提出的查询是:

POST /i/t/_search
{
    "query": {
        "query_string": {
            "fields": ["a.b.*"],
            "query": "number:[2 TO 4]"
        }          
    }
}

查询不会出现错误,但也不会返回任何结果。我什至不确定,哪种搜索查询最适合此类任务。我只使用了查询字符串,因为它是我发现的唯一可以加入未知字段名称和范围的字符串。

4

1 回答 1

0

尝试number:在您的查询中删除:

{
    "query": {
        "query_string": {
            "fields": ["a.b.*"],
            "query": "[2 TO 4]"
        }          
    }
}

可选择尝试count:[2 TO 4]文档

允许在字段路径中使用 * 通配符的另一种查询类型是多匹配查询,但老实说,在您的情况下,我不知道如何将它与数字范围结合起来。我唯一想到的是:

{
  "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 的第一个解决方案简短而强大。

于 2017-07-25T16:32:32.480 回答