过滤和匹配Elasticsearch查询

时间:2019-05-21 21:39:18

标签: elasticsearch

我无法在下面的我的elasticsearch查询中应用辅助过滤器。仅第一个过滤器匹配。我希望两个过滤器都适用于查询。

  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "filter": {
              "range": {
                "@timestamp": {
                  "gte": "2019-03-12",
                  "lte": "2019-03-13"
                }
              }
            }
          }
        },
        {
          "bool": {
            "filter": {
              "bool": {
                "must": {
                  "match": {
                    "msg_text": "foo AND bar"
                  }
                }
              }
            }
          }
        }
      ]
    }
  }

1 个答案:

答案 0 :(得分:1)

好,我提到了两种解决方案,第一种使用Match Query,第二种使用Query String

我还假设msg_text字段的类型为text

区别在于,query_string使用解析器,该解析器将基于AND, OR等运算符来解析您提到的文本。

match query会阅读文本,分析文本并在此基础上构造一个bool查询。从某种意义上说您无需提及运算符,它就行不通了

您可以在我提到的链接中阅读有关它们的更多信息。

1。使用匹配查询

POST <your_index_name>/_search
{  
   "query":{  
      "bool":{  
         "filter":{  
            "bool":{  
               "must":[  
                  {  
                     "range":{  
                        "@timestamp":{  
                           "gte":"2019-03-12",
                           "lte":"2019-03-13"
                        }
                     }
                  },
                  {  
                     "match":{  
                        "msg_text":"foo bar"         
                     }
                  }
               ]
            }
         }
      }
   }
}

2。使用查询字符串

POST <your_index_name>/_search
{  
   "query":{  
      "bool":{  
         "filter":{  
            "bool":{  
               "must":[  
                  {  
                     "range":{  
                        "@timestamp":{  
                           "gte":"2019-03-12",
                           "lte":"2019-03-13"
                        }
                     }
                  },
                  {  
                     "query_string":{  
                        "fields": ["msg_text"],    <----- You can add more fields here using comma as delimiter
                        "query":"foo AND bar"
                     }
                  }
               ]
            }
         }
      }
   }
}

从技术上讲,您的解决方案没有问题,从某种意义上讲,它可以正常工作,但我希望我的答案清楚,可以简化查询并帮助您了解要执行的操作。

让我知道是否有帮助!