将 Elasticsearch 结果范围限定为特定 ID

Scope Elasticsearch Results to Specific Ids

我对 Elasticsearch DSL 有疑问。

我想进行全文搜索,但将可搜索记录的范围限定为特定的数据库 ID 数组。

在 SQL 世界中,它将等同于 WHERE id IN(1, 2, 3, 4)

我一直在研究,但我发现 Elasticsearch 查询 DSL 文档有点晦涩难懂且缺乏有用的示例。谁能指出我正确的方向?

您可以创建一个布尔查询,在 MUST 子句中包含一个 ID 查询: https://www.elastic.co/guide/en/elasticsearch/reference/2.0/query-dsl-ids-query.html

通过在 bool 查询中使用 MUST 子句,您的搜索将进一步受到您指定的 ID 的限制。我在这里假设您所说的 ID 指的是文档的 _id 值。

这是一个可能适合您的示例查询。这假定 _all 字段在您的索引上启用(这是默认设置)。它将对索引中的所有字段进行全文搜索。此外,通过添加 ids 过滤器,查询将排除任何其 ID 不在给定数组中的文档。

{
  "bool": {
    "must": {
      "match": {
        "_all": "your search text"
      }
    },
    "filter": {
      "ids": {
        "values": ["1","2","3","4"]
      }
    }
  }
}

希望对您有所帮助!

根据es doc,您可以

Returns documents based on their IDs.

GET /_search
{
  "query": {
    "ids" : {
      "values" : ["1", "4", "100"]
    }
  }
}

使用 elasticaBundle symfony 5.2

    $query = new Query();
    $IdsQuery = new Query\Ids();
    $IdsQuery->setIds($id);
    $query->setQuery($IdsQuery);
    $this->finder->find($query, $limit);

正如 Ali Beyad 所讨论的,查询中的 ids 字段可以为您做到这一点。为了补充他的回答,我举了一个工作示例。以防以后有人需要。

GET index_name/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "field": "your query"
          }
        },
        {
          "ids" : {
            "values" : ["0aRM6ngBFlDmSSLpu_J4", "0qRM6ngBFlDmSSLpu_J4"]
          }
        }
      ]
    }
  }
}