【问题标题】:Scope Elasticsearch Results to Specific Ids将 Elasticsearch 结果范围限定为特定 ID
【发布时间】:2016-04-27 00:16:55
【问题描述】:

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

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

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

我一直在研究,但我发现 Elasticsearch 查询 DSL 文档有点神秘,而且没有有用的示例。谁能指出我正确的方向?

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl elasticsearch-rails


    【解决方案1】:

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

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

    希望这会有所帮助!

    【讨论】:

    • 谢谢布鲁克!这正是我一直在寻找的。语法的细微差别非常有帮助。非常感谢。
    • 是的,它非常强大。我绝对喜欢它,只需要一点帮助来导航语法。再次感谢!
    • 肯定有一个学习曲线,来自 SQL 背景。如果有机会,我强烈建议您阅读指南。它是无价的,而且比文档更容易理解。 elastic.co/guide/en/elasticsearch/guide/current/index.html
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 阿里贝亚德,感谢您的回复!您能否提供一个查询 json 的完整示例?我想对所有索引字段进行全文搜索并包含 MUST 子句,但我尝试过的所有操作都会导致语法错误,而且我在任何地方都找不到好的书面示例。
      • @mindtonic :所以您希望在同一个请求中同时进行全文搜索和 id 搜索?
      • 我还想看一个查询示例。将其添加到 bool 中的条件似乎没有任何作用。
      【解决方案4】:

      根据es doc,可以

      根据 ID 返回文档。

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

      【讨论】:

        【解决方案5】:

        使用 elasticaBundle symfony 5.2

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-03
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          相关资源
          最近更新 更多