Elasticsearch多个字段搜索(AND OR)

时间:2014-08-20 09:19:19

标签: elasticsearch

我正在试图找出Elasticsearch。 我浏览了整个互联网,我找到的只是基本的例子。

首先,我需要搜索两个字段(field_A,field_B)并返回结果

  • field_A的值等于valueA或valueB或valueC
  • field_B的值等于valueD

我设法做到这一点:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "terms": {
                "field_A": [
                  "valueA",
                  "valueB",
                  "valueC"
                ]
              }
            }
          ],
          "should": [
            {
              "term": {
                "field_B": "valueD"
              }
            }
          ]
        }
      }
    }
  }
}

现在我需要搜索三个字段(完全匹配)

  • (field_A = valueA AND field_B = valueB AND field_C = valueC)OR(field_A = valueA1 AND field_B = valueB1 AND field_C = valueC1)OR ...

或类似的东西:

  • field_A = valueA AND((field_B = valueB AND field_C = valueC)OR(field_B = valueB1 AND field_C = valueC1)OR ...)

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以使用elasticsearch的布尔(和/或)过滤器。

以下是您的第一个要求的简单用例,您可以根据其他要求为过滤器建模。

POST /_search 
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "or": {
               "filters": [
                  {
                     "and": {
                        "filters": [
                           {
                              "term": {
                                 "fieldA": "value_a"
                              }
                           },
                           {
                              "term": {
                                 "fieldB": "value_b"
                              }
                           },
                           {
                              "term": {
                                 "fieldC": "value_c"
                              }
                           }
                        ]
                     }
                  },
                  {
                     "and": {
                        "filters": [
                           {
                              "term": {
                                 "fieldA": "value_a1"
                              }
                           },
                           {
                              "term": {
                                 "fieldB": "value_b1"
                              }
                           },
                           {
                              "term": {
                                 "fieldC": "value_c1"
                              }
                           }
                        ]
                     }
                  }
               ]
            }
         }
      }
   }
}

对于你的要求类型使用和过滤器和或过滤器似乎很好,但总是喜欢bool过滤器(如你所做),如果你可以使用它。

参考;

And Filter

Or Filter

希望这有帮助!!感谢