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

10

我有一个关于Elasticsearch DSL的问题。

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

在SQL世界中,它相当于WHERE id IN(1, 2, 3, 4)

我一直在研究,但我发现Elasticsearch查询DSL文档有点晦涩,缺乏有用的示例。有人能指导我吗?

6个回答

11
以下是可能适合您的示例查询。这假定您的索引启用了_all字段(这是默认设置)。它将在索引中的所有字段上执行全文搜索。此外,通过添加ids过滤器,查询将排除任何id不在给定数组中的文档。
{
  "bool": {
    "must": {
      "match": {
        "_all": "your search text"
      }
    },
    "filter": {
      "ids": {
        "values": ["1","2","3","4"]
      }
    }
  }
}

希望这可以帮助你!

谢谢你,布鲁克!那正是我在寻找的。语法细微差别非常有帮助。非常感激。 - mindtonic
是的,它非常强大。我绝对喜欢它,只需要一点帮助来导航语法。再次感谢! - mindtonic
从 SQL 背景过来肯定会有一个学习曲线。当你有机会的时候,我强烈建议你阅读一下这个指南。它非常珍贵,比仅仅阅读文档容易得多。https://www.elastic.co/guide/en/elasticsearch/guide/current/index.html - BrookeB

3

正如Ali Beyad所讨论的那样,查询中的ids字段可以为您完成此操作。为了补充他的答案,我提供一个工作示例。以防未来有人需要。

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

2
根据 es doc,您可以:

根据文档ID返回文档。

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

1

Ali Beyad,谢谢您的回复!您能否提供一个完整的查询json示例?我想在所有索引字段中进行全文搜索并包括MUST子句,但我尝试过的所有内容都导致语法错误,我无法找到一个好的书面示例。 - mindtonic
@mindtonic:所以您希望在同一请求中实现全文搜索和ID搜索吗? - gfd
我还想看一个查询的示例。将它添加到布尔条件中似乎没有任何效果。 - Tum

1

你有两个选项。

  1. ids查询
GET index/_search
{
  "query": {
    "ids": {
      "values": ["1, 2, 3"]
    }
  }
}

或者

  1. terms查询
GET index/_search
{
  "query": {
    "terms": {
      "yourNonPrimaryIdField": ["1", "2","3"]
    }
  }
}

ids 查询是针对文档的内部 _id 字段(即主要 ID)的。但通常情况下,文档包含次要(及更多)ID,您可以通过terms查询来定位它们。

请注意,如果您的次要 ID 包含大写字符并且您没有将其字段映射到 keyword,则它们将被标准化(转换为小写),并且 terms 查询将显示错误,因为它仅适用于精确匹配。了解更多信息,请参阅:Elasticsearch 仅在区分大小写时返回结果


0

使用elasticaBundle symfony 5.2

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接