我无法通过弹性搜索发出AND请求

问题描述 投票:0回答:2

我想通过ES发出AND请求,因此我在must中的各个词条之间插入了tags.id(对于boolQuery),但这不起作用...我收到了元素,但像OR

{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "computerId": [
              1
            ]
          }
        },
        {
          "nested": {
            "path": "tags",
            "query": {
              "bool": {
                "must": [
                  {
                    "terms": {
                      "tags.id": [
                        1,
                        2,
                        3
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
php elasticsearch doctrine
2个回答
0
投票

您应该在布尔查询中使用nested

尝试一下:

{
"query": {
    "bool": {
      "must": [
        {
          "terms": {
            "computerId": [
              1
            ]
          }
        },
        {
          "nested": {
            "path": "tags",
            "query": {
              "term": {
                "tags.id": {
                  "value": 1
                }
              }
            }
          }
        },
        {
          "nested": {
            "path": "tags",
            "query": {
              "term": {
                "tags.id": {
                  "value": 2
                }
              }
            }
          }
        },
        {
          "nested": {
            "path": "tags",
            "query": {
              "term": {
                "tags.id": {
                  "value": 3
                }
              }
            }
          }
        }
      ]
    }
  }
}

术语的行为类似于OR,因此您的查询正在执行AND(1 OR 2 OR 3)。

术语查询返回在提供的字段中包含一个或多个确切术语的文档。

From Here

希望这会有所帮助


0
投票

如何创建带有嵌套的3个查询(对不起,我是贝里初学者):

$boolQuery1->addMust(new Term(['tags.id' => 1]));
$boolQuery2->addMust(new Term(['tags.id' => 2]));
$boolQuery3->addMust(new Term(['tags.id' => 3]));


$tagsQuery1 = new Nested();
$tagsQuery2 = new Nested();
$tagsQuery3 = new Nested();

$tagsQuery1
      ->setPath('tags')
      ->setQuery($boolQuery1);
$tagsQuery2
      ->setPath('tags')
      ->setQuery($boolQuery2);
$tagsQuery3
      ->setPath('tags')
      ->setQuery($boolQuery3);

$query = ?
© www.soinside.com 2019 - 2024. All rights reserved.