【问题标题】:How to retrieve all document ids matching a search, in elastic search?如何在弹性搜索中检索与搜索匹配的所有文档 ID?
【发布时间】:2014-07-26 17:51:27
【问题描述】:

我正在做一个简单的副项目,并且有一个涉及 SQL 数据库和 ElasticSearch 的技术堆栈。我只有 ElasticSearch,因为我假设随着项目的增长,我的全文搜索将由 ES 最有效地执行。我的 ES 架构非常简单 - 我插入 ES 的文档有 2 个字段,一个是 id,另一个是要搜索的文本正文的字段。插入到 ES 中的 id 对应于 SQL 数据库中该文档的主键 id。

insert record into SQL -> insert record into ES using PK from SQL

搜索将与此相反。查询 ES 并抓取所有匹配的 id,然后转身使用这些 id 从 SQL 中获取记录。

search ES can get all PK ids -> use those ids to get documents from SQL

我面临的问题是 ES 只能以分页方式返回文档。这是一个问题,因为我的 SQL 查询中还有一个 WHERE 子句,而不仅仅是 id。我的 SQL 查询可能看起来像这样......

SELECT * FROM foo WHERE id IN (1,2,3,4,5) AND bar != 'baz'

嗯,使用 ES 对结果进行分页,我的 WHERE 子句将始终只查询来自 ES 的完整结果的子集。即使我使用 ES 的 skiptake,我仍然只使用文档 ID 的子集查询 SQL。

有没有办法让 Elastic Search 只返回匹配文档 id 的整个列表?我意识到这是不允许我在脚下开枪的,因为这样做会跨越所有碎片和许多文档效率不高。没有办法吗?

在这个项目上投入了几个小时后,我现在才意识到我的设计很糟糕,除非我可以从 ES 获得所有这些 id。我想到的一些替代实现是将我过滤的东西存储在 SQL 中,也存储在 ES 中。一个问题是每次我在 SQL 中更新文档时都必须更新 ES 文档。这需要对我的一些数据访问代码进行相当大的重写。我可以暂时放弃 ElasticSearch,只在 Postgres 中执行搜索,直到我想出更好的方法来构建它。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    elasticsearch 不支持将每个文档匹配返回给您的查询。因为它会使系统过载。而不是这个..在elasticsearch中使用滚动概念..就像db中的游标概念..

    http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/scan-scroll.html

    有关更多示例,请参阅 Github 存储库。 https://github.com/sidharthancr/elasticsearch-java-client

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-fields.html

      请查看弹性搜索文档,您可以在其中仅指定从匹配文档返回的特定字段

      希望这能解决您的问题

      {
          "fields" : ["user", "postDate"],
          "query" : {
              "term" : { "user" : "kimchy" }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-17
        • 2015-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多