我的SQL数据库中有2000万条带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还在SOLR-5463中支持Solr 4.7的深度分页.它增加了对与搜索请求一起使用的cursorMark参数的支持.然后Solr返回指向每个后续页面的nextCursorMark.
请参阅Solr Pagination of Results文档中的“使用游标”部分.
听起来OP已经熟悉了这些选项,但我认为为了其他有类似问题的人来说,值得充实.
同样有趣:my take on the mechanics and efficiency of an Elasticsearch scrolling search.