【发布时间】: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 的 skip 和 take,我仍然只使用文档 ID 的子集查询 SQL。
有没有办法让 Elastic Search 只返回匹配文档 id 的整个列表?我意识到这是不允许我在脚下开枪的,因为这样做会跨越所有碎片和许多文档效率不高。没有办法吗?
在这个项目上投入了几个小时后,我现在才意识到我的设计很糟糕,除非我可以从 ES 获得所有这些 id。我想到的一些替代实现是将我过滤的东西存储在 SQL 中,也存储在 ES 中。一个问题是每次我在 SQL 中更新文档时都必须更新 ES 文档。这需要对我的一些数据访问代码进行相当大的重写。我可以暂时放弃 ElasticSearch,只在 Postgres 中执行搜索,直到我想出更好的方法来构建它。
【问题讨论】:
标签: elasticsearch