【问题标题】:Elasticsearch Query with And and Or Condition带有 And 和 Or 条件的 Elasticsearch 查询
【发布时间】:2017-08-30 09:55:43
【问题描述】:

我在 Elastic 中有如下数据

{
  "_index": "prod",
  "_type": "log",
  "_id": "aa",
  "_source": {
    "input_type": "log",
    "sourcetype": "sourcetypeapp1",
    "message": "APP COMPANY|80d596f6-2082-4a1d-bcfc-740478f626ec|001 ErrorMessage: Some error"
    "type": "log",
    "tags": [
      "beats_input_codec_plain_applied"
    ]
  }
}

我想搜索消息中包含以下数据的所有消息:-

(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" AND Message:"ErrorMessage")
Or
(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" AND Message:"ErrorMessage")
Or
(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" AND Message:"ErrorMessage")

我不太了解 elasticsearch 查询,

我试过下面的简单查询它不起作用(只有一个条件):

{
  "query": {
    "bool": {
      "must": {
        "bool": {
          "should": [
            {
              "match": {
                "Message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001"
              }
            }
          ]
        }
      }
    }
  }
}

【问题讨论】:

    标签: elasticsearch kibana querydsl


    【解决方案1】:
    ( (condition11 AND condition12) OR (condition21 AND condition22) )
    

    如果这是你想要达到的,试试这个

    {
      "query": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" } },
                  { "match": { "message": "ErrorMessage"}}
                ]
              }
            },
            {
              "bool": {
                "must": [
                  { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" } },
                  { "match": { "message": "ErrorMessage"}}
                ]
              }
            },
            {
              "bool": {
                "must": [
                  { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" } },
                  { "match": { "message": "ErrorMessage"}}
                ]
              }
            }        
          ]
        }
      }
    }
    

    但在您的示例中,条件 12 和条件 22 是相同的。在这种情况下,您可以将其重写为

    {
      "query": {
        "bool": {
          "must": [
            { "match": { "message": "ErrorMessage"}},
            { 
              "bool": {
                "should": [
                  { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" } },
                  { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" } },
                  { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" } }
                ]
              } 
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 我试过这个查询我没有得到正确的结果,好像任何包含 4a1d 的消息都被显示了。但我希望整个短语在整个文本中匹配,“COMPANY|80d596f6-2082-4a1d -bcfc-740478f626eA|001"
    • 我以为您想知道如何使用 AND 条件的多 OR 条件。如果要匹配整个文本,则应使用通配符不匹配。 elastic.co/guide/en/elasticsearch/reference/5.5/…Match 分析您提供的文本,然后构造查询。
    • 但这取决于您如何定义架构。如果消息属性/字段未定义为 index: not_analyzed(请参阅 elastic.co/guide/en/elasticsearch/reference/5.5/…),您将无法使用通配符来解决此问题。因为您的文本将被标记并保存为多个字符串而不是一个完整的字符串。在这种情况下,您无法匹配完整的文本,因为它不存在。您必须在单个必须中编写每个部分的多个匹配查询(例如:COMPANY、80d596f6、2082 等),因为您希望它检索包含所有这些的行。
    • 我不明白,请您提供示例
    • 在我看来,连字符会引起问题,充当通配符。我不知道如何避免这种情况
    【解决方案2】:

    你可以试试类似的东西

    {
     "query": {
      "match": {
         "Message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001"
      }
     }
    }
    

    【讨论】:

    • 如何添加多个and或条件?
    • 你可以在 bool 查询中使用 should (OR) 和 must (AND)
    • 我已经尝试过这个查询我没有得到正确的结果,好像任何消息都包含 -2082- 然后全部都显示出来。但我希望整个短语在整个文本中匹配,“COMPANY|80d596f6- 2082-4a1d-bcfc-740478f626eA|001。看起来像由于连字符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2018-06-03
    • 2011-05-08
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多