【问题标题】:Nested search query in Elasticsearch with range filter and unknown names of inner fieldsElasticsearch 中的嵌套搜索查询,带有范围过滤器和内部字段的未知名称
【发布时间】:2017-07-26 00:38:59
【问题描述】:

我将数据存储在 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]"
        }          
    }
}

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

【问题讨论】:

    标签: elasticsearch nested range-query


    【解决方案1】:

    尝试在您的查询中删除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 的第一个解决方案简短而强大。

    【讨论】:

    • 嘿@Joanna,我对弹性搜索如何在低级别工作感到困惑。 a.b.* 搜索的“成本”是多少? Elasticsearch 必须迭代所有子键 (x,y,z) 和列表中的所有值以匹配它?
    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多