首页 > 解决方案 > Elastic Search 多个 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"
                                    }
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}

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

标签: elasticsearchnest

解决方案


看起来您需要在一个查询中包含两个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
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

推荐阅读