【问题标题】:Elasticsearch match list against field针对字段的 Elasticsearch 匹配列表
【发布时间】:2014-05-11 17:51:18
【问题描述】:

我有一个列表、数组或任何你熟悉的语言。例如。名称:["John","Bas","Peter"] 并且我想查询 name 字段是否匹配其中一个名称。

一种方法是使用 OR 过滤器。例如

{
    "filtered" : {
        "query" : {
            "match_all": {}
        },
        "filter" : {
            "or" : [
                {
                    "term" : { "name" : "John" }
                },
                {
                    "term" : { "name" : "Bas" }
                },
                {
                    "term" : { "name" : "Peter" }
                }
            ]
        }
    }
}

有什么更好的方法吗?如果是查询而不是过滤器。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:
    {
      "query": {
        "filtered" : {
          "filter" : {
            "terms": {
              "name": ["John","Bas","Peter"]
            }
          }
        }
      }
    }
    

    哪个 Elasticsearch 重写就像你用过这个一样

    {
      "query": {
        "filtered" : {
          "filter" : {
            "bool": {
              "should": [
                {
                  "term": {
                    "name": "John"
                  }
                },
                {
                  "term": {
                    "name": "Bas"
                  }
                },
                {
                  "term": {
                    "name": "Peter"
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    当使用布尔过滤器时,大多数时候,使用bool 过滤器比使用andor 更好。原因在 Elasticsearch 博客上有解释:http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

    【讨论】:

    • 谢谢,所以terms 是我需要的。我在我的情况下输入了查询
    • filtered 现在已弃用,请参阅 Erfan 的回答
    【解决方案2】:

    当我尝试filtered 查询时,我得到了no [query] registered for [filtered],基于answer here,过滤后的查询似乎已在 ES 5.0 中被弃用和删除。所以我提供使用:

    {
        "query": {
            "bool": {
                "filter": {
                    "terms": {
                        "name": ["John","Bas","Peter"]
                    }
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      示例查询 = 按关键字和值列表过滤

      {
          "query": {
              "bool": {
                  "must": [
                      {
                          "term": {
                              "fguid": "9bbfe844-44ad-4626-a6a5-ea4bad3a7bfb.pdf"
                          }
                      }
                  ],
                  "filter": {
                      "terms": {
                          "page": [
                              "1",
                              "2",
                              "3"
                          ]
                      }
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多