【问题标题】:How efficient is a Solr / Lucene on huge sorted query with limit clauseSolr / Lucene 对带有限制子句的大型排序查询的效率如何
【发布时间】:2016-07-26 09:04:42
【问题描述】:

我有一个包含近 2G 文档的分片。 我试图了解其结果集包含大部分文档但包含排序和限制的查询的效率。
在 SQL 数据库中,数据库可以使用排序和限制子句根据排序的字段索引仅检查非常少量的行。
Lucene / Solr 也这样做吗?

Query example: select * sort by date limit 50

【问题讨论】:

  • Solr/Lucent 使用倒排索引。它没有排序信息。 SQL 有 b-tree,它是排序(精确匹配)索引。因此,对于有序查询,SQL 是首选的数据库。

标签: solr lucene full-text-search


【解决方案1】:

请记住,solr/lucene 专注于全文搜索。

因此,您的 SQL 查询并不是真正的“搜索”(在 solars fulltext.search 的含义中)。这更像是从具有排序和限制的数据库中提取数据。

将 SQL 数据库视为类似于 excel 表的东西,其中您可以直接超出每一行的列。

不要进入 solr 的观点,它是一个索引,就像一本书的目录。

因此,如果您搜索所有 (*),按日期排序(这在 solr 中是可能的),solr(可能)将遍历整个索引,收集时间信息以便对其进行排序并在 50 个文档后削减输出.

这将在 solr 中很好地工作,但我认为从数据库中选择它会更有效。因为交付(和存储)数据正是它(数据库)的设计目的。

在 solr 中有不同类型的缓存和机制,它们专注于在字段中搜索术语。 solr 的重点不在于传递数据。

如果你真的(只)需要返回文档,而不需要搜索,那么 SQL 数据库可能会比 solr 更高效。

但是:如果您开始在“行”中搜索术语,那么 solr/lucene 是选择的方式。

【讨论】:

    【解决方案2】:

    相似但不同。

    这里讨论了 Solr 中的排序: https://cwiki.apache.org/confluence/display/solr/Common+Query+Parameters#CommonQueryParameters-ThesortParameter

    限制行数: https://cwiki.apache.org/confluence/display/solr/Common+Query+Parameters#CommonQueryParameters-TherowsParameter

    此处讨论了日期字段: https://cwiki.apache.org/confluence/display/solr/Working+with+Dates

    Solr 的 TrieDateField 使用 64 位整数(不是字符串)来保存日期,表示自 1970 年 1 月 1 日以来的毫秒数。 https://cwiki.apache.org/confluence/display/solr/Working+with+Dates?focusedCommentId=61338556#comment-61338556

    您将查询 Solr,在 TrieDateField 类型的字段上指定排序。 Solr 将按该排序对结果进行排序,响应中的文档数基于“行”参数。效率与 SQL DB 相当。试试看。

    【讨论】:

    • 感谢您的回答,但我正在寻找有关在这种情况下如何执行查询的信息,而您的回答中没有回答。 @rleir
    • 标题说“效率如何”。也许你可以编辑它? @Avner 征费
    猜你喜欢
    • 2013-08-16
    • 2012-02-12
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2011-05-21
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多