弹性搜索多个 AND + OR 查询

如何解决弹性搜索多个 AND + OR 查询

我的文档架构如下。

推文

Id
Title
Body
Privacy -> Values can only be ["Me","Anyone","Team"]
UserId

现在我只想检索标题包含“鸡肉三明治”的所有推文,这些推文具有“任何人”或“团队”的隐私。但是,在同一个查询中,如果该推文的 UserId 为“1456”,我只希望返回隐私为“我”的推文。

{
    "query": {
        "bool": {
            "must": [
                {
                    "bool": {
                        "must": [
                            {
                                "match": {
                                    "title": {
                                        "query": "chicken_sandwhich"
                                    }
                                }
                            }
                        ]
                    }
                }
            ],"should": [
                {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "privacy": {
                                        "value": "Anyone"
                                    }
                                }
                            },{
                                "term": {
                                    "privacy": {
                                        "value": "Team"
                                    }
                                }
                            }
                        ]
                    }
                },{
                    "bool": {
                        "must": [
                            {
                                "term": {
                                    "privacy": {
                                        "value": "Me"
                                    }
                                }
                            },{
                                "term": {
                                    "userId.keyword": {
                                        "value": "my_user_id"
                                    }
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}

如何构造该查询?我一直在苦苦挣扎,只是需要关于我正在寻找的查询类型的帮助。

解决方法

看起来您需要将两个 must 包裹在一个 should 查询中:

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "match": {
                  "Title": "chicken sandwich"
                }
              },{
                "terms": {
                  "Privacy.keyword": [
                    "Anyone","Team"
                  ]
                }
              }
            ]
          }
        },{
          "bool": {
            "must": [
              {
                "term": {
                  "Privacy.keyword": {
                    "value": "Me"
                  }
                }
              },{
                "term": {
                  "UserId": {
                    "value": 1456
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}
,

您可能还想考虑query_string。这将让您以简单的方式编写查询,例如:

Title:"chicken sandwich" AND (
  Privacy:(Anyone OR Team)
  OR (Privacy:Me AND UserId:1456)
)

或实际格式:

{
  "query": {
    "query_string": {
      "query": "Title:\"chicken sandwich\" AND (Privacy:(Anyone OR Team) OR (Privacy:Me AND UserId:1456))",}
  }
}

请参阅此处的文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?