首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理Solr中的大量ids

处理Solr中的大量ids
EN

Stack Overflow用户
提问于 2013-05-01 17:01:53
回答 4查看 1K关注 0票数 6

我需要在Solr中执行在线搜索,即用户需要查找与特定标准在线的用户列表。

我是如何处理这个问题的:我们将用户的id存储在一个表中,并在Solr请求中发送所有在线用户id,如下所示

代码语言:javascript
复制
&fq=-id:(id1 id2 id3 ............id5000)

这种方法的问题是,当is变得很大时,Solr需要花费太多的时间来解决,我们需要通过网络传输大型请求。

一种解决方案是在Solr中使用join,但在线数据定期更改,我不能每次都对数据进行索引(比如5-10分钟,应该至少一个小时)。

另一种解决方案我认为可以根据URL中的某些参数从Solr内部触发该查询。我对Solr的内部结构不是很了解,所以不知道该怎么做。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-06 01:49:19

使用solr4的软提交,提交已经变得足够便宜,实际上直接在用户记录中存储"online“标志是可行的,只需在查询中使用&fq=online:true。这减少了通过网络发送5000个id并解析它们所涉及的开销,并让Solr对查询进行了一些优化。无论何时有人登录或注销,都要设置他们的状态,并在更新时设置commitWithin。不管怎样,这值得一试。

票数 3
EN

Stack Overflow用户

发布于 2013-05-06 17:14:41

我们通过实现数据分片解决了这个问题。

基本上,不深入代码细节:

  • 编写您自己的索引代码
    • 使用consistent hashing决定哪个ID去往哪个Solr服务器
    • 将每个用户数据索引到相关的分片(可以是多台计算机)
    • 确保您有Solr

  • Query Solr分片
    • 使用shards parameter
    • Start an EmbeddedSolr在Solr中执行分片查询,并使用它执行分片查询
    • Solr将查询所有分片并合并结果,如果您需要限制每个分片的查询时间,它还提供超时

即使我在上面说了所有的话,我还是不相信Solr是一个很好的选择。Solr并不是很适合在不断变化的索引上进行搜索,而且如果您主要通过ID进行搜索,则不需要搜索引擎。

对于我们的项目,我们基本上自己实现了所有的索引构建、负载平衡和查询引擎,并主要使用Solr作为存储。但我们开始使用Solr时,分片是flaky的,性能不佳,我不确定它现在的状态是什么。

最后,如果我今天从头开始构建这个系统,而没有我们在过去4年中所做的所有工作,我会建议使用缓存来存储当前在线的所有用户(比如memcachedredis),在请求时,我会简单地迭代所有用户,并根据条件过滤掉它们。条件过滤可以独立缓存并以增量方式更新,如果匹配逻辑非常简单,那么迭代5000条记录也不一定非常耗时。

票数 3
EN

Stack Overflow用户

发布于 2013-05-06 13:56:01

任何健壮的解决方案都将包括使您的数据接近SOLR (批处理)并在内部使用它。在搜索期间不运行非常大的请求,这是低延迟的事情。您应该开发自己的筛选器;筛选器会偶尔(比如每分钟)缓存在线用户的数据。如果数据更改非常频繁,请考虑实现PostFilter。

你可以在这里找到一个很好的过滤器实现的例子:http://searchhub.org/2012/02/22/custom-security-filtering-in-solr/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16315398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档