solr - 搜索软件/服务器的替代方法以检索所有匹配文档的 ID

标签 solr elasticsearch lucene sphinx

我正在尝试弄清楚如何根据关键字匹配过滤大量文档。

我的 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/

相关文章:

php - 使用 PHP 进行慢速 solr 索引

solr - 有 Solr-Camel 组件吗?

java - hibernate "update"操作后 Lucene 上的索引未更新

java - Zend Lucene 是否需要 Java Lucene?

sql - 查找半径重叠的Geopoint

linux - 不禁止对文件的写访问,而是丢弃它们?

ruby-on-rails - 带有标量字段和全文搜索的 Rails Sunspot Solr any_of

java - Solr 文档删除延迟

elasticsearch - 使用为其他索引模式(相同数据)创建的Visualize Kibana?

java - Elasticsearch match_pharse 查询无法正常工作