【问题标题】:How to query for empty field or specific value如何查询空字段或特定值
【发布时间】:2018-02-13 09:11:43
【问题描述】:

我正在尝试编写查询以实现以下结果:

field1: value1 AND 
field2: value2 OR "" (empty)

我尝试了以下方法,但它总是返回空结果:

{
  "_source": ["field1", "field2"], 
  "query": {
    "bool": {
      "must": [
        {"match": { "field1": "value1" }},
        {
          "bool": {
            "should": [
              { 
                "match": {
                  "field2": "value2"
                }
              }
            ],
            "must_not": [
              {
                "exists": { "field": "field2" }
              }
            ]
          }
        }
      ]
    }
  }
}

我相信我在做一个自相矛盾的查询。

【问题讨论】:

  • 我认为你犯了一个逻辑错误,将 must_not 和 should 放在同一级别。 Must_not 应该在should[{...},bool:{must_not:[...]}]

标签: elasticsearch kibana


【解决方案1】:

这看起来很复杂。

尝试使用 queryStringQuery 尝试像这样重写您的查询

{
    "_source": ["field1", "field2"], 
    "query": {
      "query_string": {
        "query": "field1:value1 AND (field2:value2 OR (!field2:*))"
      }
    }

}

如果你还想用这种格式

您使用了 must_not 子句,根据您的用例,这在某种程度上意味着如下。

field1: value1 AND

field2: value2 AND NOT ""(空)

你应该做的是

   {
  "_source": [
    "field1",
    "field2"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "field1": "value1"
          }
        },
        {
          "bool": {
            "should": [
              {
                "match": {
                  "field2": "value2"
                }
              },
              {
                "bool": {
                  "must_not": [
                    {
                      "exists": {
                        "field": "field2"
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

但如果您想首先分析您在查询中完成的查询中的术语,那么使用 queryString 会更容易。

所以在这种情况下使用 queryString OR bool 是一样的

【讨论】:

  • 因为它是完全匹配的,所以我不会使用 query_string。匹配或术语应该一样好。但总的来说这是一个很好的解决方案。
  • @MrSimple 谢谢。但在问题中,他使用的是匹配查询,这也是全文查询并将被分析。这就是我建议这个的原因。
  • 谢谢@MrSimple 和 Gaurav-Arya。事实上,我还不确定我应该选择哪一个,完全匹配还是全文。我会尝试两个。
  • 试着根据你的用例来思考它。全文查询首先分析搜索字符串,然后搜索生成的标记。完全匹配查询按原样搜索搜索字符串。您所做的是一个全文查询。这是指向它的链接。全文->elastic.co/guide/en/elasticsearch/reference/current/…任期级->elastic.co/guide/en/elasticsearch/reference/current/…
  • 在这种情况下是否存在查看整个字段是否存在..不仅仅是该字段为空。我有同样的问题......不幸的是,这个“存在”并没有返回空字符串文档。
猜你喜欢
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2019-05-02
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 2020-06-19
相关资源
最近更新 更多