如何在弹性搜索中检索与搜索匹配的所有文档ID?

时间:2014-06-16 21:11:41

标签: elasticsearch

我正在开发一个简单的辅助项目,并且拥有一个涉及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。

有没有办法让弹性搜索只返回匹配文档ID的整个列表?我意识到这是不允许我在脚下射击自己,因为这样做是为了所有碎片和许多文档效率不高。但是,没办法吗?

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

2 个答案:

答案 0 :(得分:3)

elasticsearch不支持将每个doc匹配返回给您查询。因为它Ll超载系统。而不是这个..在elasticsearch中使用滚动概念..它在数据库中有点像光标概念..

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

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

希望有所帮助......

答案 1 :(得分:0)

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

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

希望这可以解决您的问题

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