【问题标题】:Improving the speed of Solr query over 16 million tweets提高 Solr 查询超过 1600 万条推文的速度
【发布时间】:2012-12-07 03:21:13
【问题描述】:

我使用 Solr (SolrCloud) 来索引和搜索我的推文。大约有 1600 万条推文,索引大小约为 3 GB。推文在出现时会被实时索引,以便启用实时搜索。目前我使用lowercase 字段类型作为我的推文正文字段。对于搜索中的单个搜索词,大约需要 7 秒,并且随着每个搜索词的添加,搜索所花费的时间线性增加。 3GB 是为 solr 进程分配的最大 RAM。示例 solr 搜索查询如下所示

tweet_body:*big* AND tweet_body:*data* AND tweet_tag:big_data

对提高搜索速度有什么建议吗?目前我只运行 1 个包含整个推文集合的分片。

【问题讨论】:

  • 可能有多个经常使用的分片(可能是 tweet_tag),因为分片键可能会有所帮助。
  • 我不认为这是一个碎片问题,因为我在另一个字段上进行搜索并且返回速度非常快。该字段是推文句柄,它会在 10 毫秒内返回。
  • 同意,但是在分片时,您的索引大小会减小(因为它分布在多个分片上)并且可能会提高您的整体性能。或者,鉴于您的 RAM 有限,您的索引也会耗尽内存。尝试增加 RAM,因为整个索引可以驻留在 RAM 中以便更快地访问。
  • 目前,我的 solr 进程的Xmx 超过了整个索引。
  • 你对这个慢查询做过解释吗?那是在使用索引吗?

标签: java search solr information-retrieval solrcloud


【解决方案1】:

尝试使用过滤查询,因为过滤查询是并行运行的

【讨论】:

    【解决方案2】:

    查询tweet_body:*big* 可能会表现不佳。尾随通配符很容易,可以使用 ReversedWildcardFilterFactory 轻松处理前导通配符。然而,两者都必须扫描每个文档,而不是能够利用索引来定位匹配的文档。结合这两种方法只会让你搜索:

    tweet_body:*big tweet_body:big*
    

    这不是一回事。如果您确实必须搜索带有前导和尾随通配符的术语,我建议您考虑将您的数据索引为 N-gram。


    我以前不知道,但似乎lowercase 字段类型是小写过滤的关键字分析器。这不是你想要的。这意味着整个字段被视为单个标记。适用于标识号等,但不适用于您希望对其执行全文搜索的正文。

    所以是的,你需要改变它。 text_general 可能是合适的。这将索引一个正确标记的字段,您应该能够执行您正在寻找的查询:

    tweet_body:big AND tweet_body:data AND tweet_tag:big_data
    

    您将不得不重新编制索引,但这是无法避免的。没有对关键字字段执行全文搜索的好方法。

    【讨论】:

    • 我需要在 tweet_body 字段的任意位置搜索包含 big 和 data 的推文。我指定的查询返回正确的结果,但它花费的时间太长,我对查询所做的任何更改都不会返回预期的结果。这可能是将该字段声明为lowercase 的结果。不确定是否将该字段重新声明为 text_en 并重新索引整个事物是唯一的选择。目前我认为查询正在扫描所有文档。
    • 是的,查询正在扫描所有文档(或至少所有与tweet_tag:big_data 匹配的文档)。我已经添加到答案中,解释了为什么 lowercase 类型会给您带来麻烦。希望这能让事情进展得更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多