【问题标题】:Elasticsearch multiple fields search (AND OR)Elasticsearch 多字段搜索(AND OR)
【发布时间】:2014-08-20 21:04:27
【问题描述】:

我正在尝试找出 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 ... )

我该怎么做?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以使用弹性搜索的布尔(和/或)过滤器。

    这是您的第一个需求的简单用例,您可以为其他需求建模过滤器。

    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"
                                  }
                               }
                            ]
                         }
                      }
                   ]
                }
             }
          }
       }
    }
    

    对于您的需求类型,使用 and filter 和 or filter 似乎不错,但如果可以使用,请始终更喜欢 bool 过滤器(就像您所做的那样)。

    参考资料;

    And Filter

    Or Filter

    希望这会有所帮助!!谢谢

    【讨论】:

    • 他有什么理由总是喜欢使用布尔过滤器而不是使用和/或过滤器?
    • 布尔过滤器使用文档的位集来标记过滤器是否匹配(并且它被缓存),这对性能有巨大影响,和/或过滤器不匹配(它们通过过滤文档到文档) .文章将使概念更加清晰。 elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets
    • 好的,谢谢您的信息!我认为和/或过滤器也使用了位集。
    猜你喜欢
    • 2020-07-20
    • 2018-12-22
    • 1970-01-01
    • 2015-03-08
    • 2021-12-06
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多