我正在尝试弄清楚如何根据关键字匹配过滤大量文档。
我的 SQL 数据库中有 20 多万个带有 ID 和(几个)文本字段的条目,我想获取文本与一组关键字匹配的所有 ID。这包括更复杂的表达式,例如:
(term1 NEAR term2 NEAR term3) AND NOT "A phrase" AND @fieldXYZ "wildcards%aswell*"
结果不需要以任何方式进行评分、排序或排名。
据我了解,Lucene/Solr、Sphinx 和 ElasticSearch 的强大之处在于可以超快地返回 TOP 文档,但它们并不是真的要返回所有文档。
我知道可以使用 Lucene 中的自定义收集器(请参阅 What's the most efficient way to retrieve all matching documents from a query in Lucene, unsorted? )并可能使用 Solr/Elasticsearch 中的 Cursors/Scrolling 来执行此操作,但我想知道是否有任何其他技术专门为此优化问题?
最佳答案
From what I understand the power of Lucene/Solr, Sphinx and ElasticSearch is to give back the TOP documents super fast but they are not really intended to give back ALL documents.
其实,这曾经是真的,但最近几年好多了。当涉及到其他软件选项时,我会听从其他人的意见,但 Lucene 在 4.x 系列的早期确实进行了一些改进,可以使用游标进行高效的深度分页。
Elasticsearch 有一个特别好的 API:Scrolling Search .要使用它,您需要使用 scroll
参数提供您的搜索查询。然后它返回一个 scroll_id
游标,您可以使用它对每个页面发出后续请求。
如果您不关心排序,只想返回所有文档,那么您也可以指定搜索类型扫描
。这将以最有效的顺序返回所有文档,不应用任何特定的排序。
我在这里掩盖了一些细节,你会想看看 Scrolling Search文档以获得更详尽的描述。
自 SOLR-5463 中的 Solr 4.7 起,Solr 还支持深度分页。 .它添加了对与搜索请求一起使用的 cursorMark
参数的支持。然后 Solr 返回指向每个后续页面的 nextCursorMark
。
请参阅 Solr 的 Pagination of Results 中的“使用游标”部分文档。
听起来 OP 已经熟悉这些选项,但我认为为了其他有类似问题的人,值得充实一下。
也很有趣:my take on the mechanics and efficiency of an Elasticsearch scrolling search .
关于solr - 搜索软件/服务器的替代方法以检索所有匹配文档的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27986498/