如何在elasticsearch查询中对具有不同值的同一字段应用OR过滤器

问题描述

我希望在具有不同值的同一字段上添加过滤器。 基本上我想获取带有 mode1 或 mode2 类型过滤器的文档。以下查询有问题。

 {
   "index": "abcdef*","from": 0,"size": 50,"body": {
   "query": {
     "bool": {
         "must": [{ "term": { "id": "123455" } }],"filter": [{ "term": { "mode": "mode1" } },{ "term": { "mode": "mode2" } }]
     }
   } 
  }
 }

解决方法

您需要将 bool/should 子句与 filter 子句一起使用

 {
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "id": "123455"
          }
        }
      ],"filter": [
        {
          "bool": {
            "should": [
              {
                "term": {
                  "mode": "mode1"
                }
              },{
                "term": {
                  "mode": "mode2"
                }
              }
            ]
          }
        }
      ]
    }
  }
}
,

您可以尝试使用嵌套的 bool 查询并应用类似于 OR 查询的 should 子句。

ItemIdentifierType
,

最好将 bool/should 移到顶层并使用 bool/filter 而不是 bool/must 作为词条查询(因为您不需要相关性,只需回答是/否即可id 字段上的约束):

{
  "query": {
    "bool": {
      "minimum_should_match": 1,"should": [
        {
          "term": {
            "mode": "mode1"
          }
        },{
          "term": {
            "mode": "mode2"
          }
        }
      ],"filter": [
        {
          "term": {
            "id": "123455"
          }
        }
      ]
    }
  }
}

或者甚至更好,只需利用 terms 查询,它使查询变得尽可能简单:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "id": "123455"
          }
        },{
          "terms": {
            "mode": ["mode1","mode2"]
          }
        }
      ]
    }
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...