【问题标题】:Elastic Search multiple AND + OR queryElastic Search 多个 AND + OR 查询
【发布时间】:2022-04-19 15:39:31
【问题描述】:

我的文档架构如下。

推特

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

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

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    看起来您需要将两个 musts 包裹在一个 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
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      您可能还想考虑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

      【讨论】:

        猜你喜欢
        • 2022-10-04
        • 1970-01-01
        • 2023-01-13
        • 1970-01-01
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-25
        相关资源
        最近更新 更多