我正在做一个简单的附带项目,并且有一个技术栈,它包含一个SQL数据库和一个ElasticSearch。我只有ElasticSearch,因为我认为随着项目的发展,我的全文搜索将以ES最有效的方式执行。我的ES模式非常简单--我在ES中插入的文档有两个字段,一个是id,另一个是要搜索文本正文的字段。插入到ES中的id对应于来自SQL数据库的文档的主键id。
insert record into SQL -> insert record into ES using PK from SQL搜索将是相反的。查询ES并获取所有匹配的ids,然后转身使用这些ids从SQL获取记录。
search ES can get all PK ids -> use those ids to get documents from SQL不过,我面临的问题是,ES只能以分页的方式返回文档。这是一个问题,因为在我的SQL查询中,除了ids之外,还有一个WHERE子句。我的SQL查询可能如下所示。
SELECT * FROM foo WHERE id IN (1,2,3,4,5) AND bar != 'baz'在ES对结果进行分页时,我的WHERE子句总是只查询ES的全部结果的子集。即使我使用ES的skip和take,我仍然只使用文档ids的子集来查询SQL。
有办法让弹性搜索只返回匹配的文档in的全部列表吗?,我意识到这是为了不允许我对自己开枪,因为在所有的碎片和许多文档中这样做都是没有效率的。但没有办法吗?
在这个项目投入了几个小时之后,我才意识到我设计得很差,除非我可以从ES中获得所有这些ids。我想过的一些替代实现是将我正在过滤的内容也存储在ES中的SQL中。有一个问题是,每次在SQL中更新文档时,我都必须更新ES文档。这需要对我的一些数据访问代码进行相当大的重写。我可以把ElasticSearch放在一起,在Postgres中执行搜索,直到我想出一个更好的方法来构建这个结构。
发布于 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
希望能帮上忙..。
发布于 2014-07-26 09:51:27
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-fields.html
请查看弹性搜索文档,其中只能指定从匹配文档返回的特定字段。
希望这能解决你的问题
{
"fields" : ["user", "postDate"],
"query" : {
"term" : { "user" : "kimchy" }
}
}https://stackoverflow.com/questions/24252275
复制相似问题