首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在弹性搜索中检索与搜索匹配的所有文档ids?

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

Stack Overflow用户
提问于 2014-06-16 21:11:40
回答 2查看 5.8K关注 0票数 1

我正在做一个简单的附带项目,并且有一个技术栈,它包含一个SQL数据库和一个ElasticSearch。我只有ElasticSearch,因为我认为随着项目的发展,我的全文搜索将以ES最有效的方式执行。我的ES模式非常简单--我在ES中插入的文档有两个字段,一个是id,另一个是要搜索文本正文的字段。插入到ES中的id对应于来自SQL数据库的文档的主键id。

代码语言:javascript
复制
insert record into SQL -> insert record into ES using PK from SQL

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

代码语言:javascript
复制
search ES can get all PK ids -> use those ids to get documents from SQL

不过,我面临的问题是,ES只能以分页的方式返回文档。这是一个问题,因为在我的SQL查询中,除了ids之外,还有一个WHERE子句。我的SQL查询可能如下所示。

代码语言:javascript
复制
SELECT * FROM foo WHERE id IN (1,2,3,4,5) AND bar != 'baz'

在ES对结果进行分页时,我的WHERE子句总是只查询ES的全部结果的子集。即使我使用ES的skiptake,我仍然只使用文档ids的子集来查询SQL。

有办法让弹性搜索只返回匹配的文档in的全部列表吗?,我意识到这是为了不允许我对自己开枪,因为在所有的碎片和许多文档中这样做都是没有效率的。但没有办法吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-17 18:16:39

elasticsearch不支持返回与查询匹配的每个文档。因为它会使系统超负荷。而不是这个。在elasticsearch中使用滚动概念。这是db‘s中的lik游标概念。

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

要获得更多的例子,请参考Github回购。https://github.com/sidharthancr/elasticsearch-java-client

希望能帮上忙..。

票数 3
EN

Stack Overflow用户

发布于 2014-07-26 09:51:27

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

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

希望这能解决你的问题

代码语言:javascript
复制
{
    "fields" : ["user", "postDate"],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24252275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档