当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch:使用OR对多个字段进行筛选

赵雅懿
2023-03-14

我有一个文档索引。我想过滤公共文档或由我的组成员(用户1和3)共享给组的文档。

隐私="公共"或(1,3)中的隐私="组"和user_id)

我可以分开做,但是如何将它们与OR结合起来?

"filter" : [
            {"terms" : { "privacy" : ["public"]}},
        ]
"filter" : [
            {"terms" : { "privacy" : ["group"]}},
            {"terms" : { "user_id" : [1,3]}},
        ]

文件:

  • {“id”:1,“user_id”:1, “隐私”:“公共”,“标题”:“为一个人做饭”,}
  • {“id”:3,“user_id”:1, “隐私”:“组”,“标题”:“三的公司”}
  • {“id”:4,“user_id”:2, “隐私”:“公共”,“标题”:“四种饮食方式”}
  • {“id”:6,“user_id”:2, “隐私”:“组”,“标题”:“六点钟新闻”}
  • {“id”:7,“user_id”:3, “隐私”:“公共”,“标题”:“幸运七”}
  • {“id”:9,“user_id”:3, “隐私”:“组”,“标题”:“九只动物画”}

正确的查询将返回文档 1、3、4、7、9,但不会返回 6。

共有1个答案

璩俊雅
2023-03-14

诀窍是将两个子查询都包装在一个bool-should中:

{
  "query": {
    "bool": {
      "should": [
        {
          "terms": { "privacy": [ "public" ] }
        },
        {
          "bool": {
            "filter": [
              {
                "terms": { "privacy": [ "group" ] }
              },
              {
                "terms": { "user_id": [ 1, 3 ] }
              }
            ]
          }
        }
      ]
    }
  }
}

仅供参考:注意必须过滤器之间的区别。TL;DR filter forgoes scoreing.

编辑:

{
  "terms":{
    "privacy":[
      "public"
    ]
  }
}

大致等同于(除了上面讨论的评分部分)

{
  "bool":{
    "filter":{
      "terms":{
        "privacy":[
          "public"
        ]
      }
    }
  }
}

这完全等同于

{
  "bool":{
    "filter":[
      {
        "terms":{
          "privacy":[
            "public"
          ]
        }
      }
    ]
  }
}

这只是一个冗长的问题。

编辑2:包含2个过滤器的重写查询

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "filter": [
              {
                "terms": { "privacy": [ "public" ] }
              }
            ]
          } 
        },
        {
          "bool": {
            "filter": [
              {
                "terms": { "privacy": [ "group" ] }
              },
              {
                "terms": { "user_id": [ 1, 3 ] }
              }
            ]
          }
        }
      ]
    }
  }
}
 类似资料:
  • 问题内容: 我想对elasticsearch 进行过滤,但我不知道… 这是我发送给ES _search方法的内容。 但是我总是会收到这个错误: 而且,如果我删除该选项并仅对geo_distance进行过滤,则可以使用…任何帮助都将是极好的。 干杯 问题答案: 我认为您的过滤器写有误。该错误表明过滤器或多或少地在参数方面遇到问题。参见http://www.elasticsearch.org/guid

  • 示例文档 索引定义 内部无源过滤的响应良好。 响应包含嵌套属性的所有属性。即开始时间、结束时间和文本行。如何在响应中仅返回endtime和startTime? 查询失败 错误HTTP/1.1 400错误请求内容类型:application/json;字符集=UTF-8内容长度:265 {"错误":{"root_cause":[{"type":"illegal_argument_exception"

  • 我有一个本地索引表,如下所示。 如何进行类似startDate的查询 据我所知,要对结果进行排序,我需要使用InvoiceDateLocalIndex。但如果使用,则会出现错误“筛选器表达式只能包含非主键属性:主键属性:InvoiceDate”

  • 问题内容: 我有一个Java对象列表,希望根据多个字段进行排序。 是否可以使用或接口根据多个字段对列表进行排序?我看到的所有示例仅根据一个领域进行排序。换句话说,可以按“校园”或“教师”或“建筑”进行排序。我想按“校园”,“教师”,“建筑”(因为它在SQL中存在)进行排序 问题答案: 您的比较器如下所示: 基本上,只要到目前为止已比较的属性相等(),它就会继续比较类的每个连续属性。

  • 我的文档具有如下所示的嵌套字段: 嵌套字段的映射如下所示: 在切换到ElasticSearch2之前,我使用aggs查询了没有结果的文档。以下是查询的聚合部分: 现在我切换到了ElasticSerach2,它只计算所有文档。我已经尝试了不同的方法,比如计算所有文档和计算结果,这样我就可以减去结果,但是 总是0 如何正确筛选/计算嵌套字段?

  • 问题内容: 我很难用Elasticsearch构建查询。 我想查询类似的东西: 所以我试图构造的是这样的: 但这似乎返回一个错误。 谁能给我一个指针,我应该如何看待用Elasticsearch进行这种OR查询? 我当前的数据已发送: 和我的查询: 返回此错误: 问题答案: 这是由于JSON格式错误所致。此查询的正确JSON格式如下-