我需要在Solr中执行在线搜索,即用户需要查找与特定标准在线的用户列表。
我是如何处理这个问题的:我们将用户的id存储在一个表中,并在Solr请求中发送所有在线用户id,如下所示
&fq=-id:(id1 id2 id3 ............id5000)这种方法的问题是,当is变得很大时,Solr需要花费太多的时间来解决,我们需要通过网络传输大型请求。
一种解决方案是在Solr中使用join,但在线数据定期更改,我不能每次都对数据进行索引(比如5-10分钟,应该至少一个小时)。
另一种解决方案我认为可以根据URL中的某些参数从Solr内部触发该查询。我对Solr的内部结构不是很了解,所以不知道该怎么做。
发布于 2013-05-06 01:49:19
使用solr4的软提交,提交已经变得足够便宜,实际上直接在用户记录中存储"online“标志是可行的,只需在查询中使用&fq=online:true。这减少了通过网络发送5000个id并解析它们所涉及的开销,并让Solr对查询进行了一些优化。无论何时有人登录或注销,都要设置他们的状态,并在更新时设置commitWithin。不管怎样,这值得一试。
发布于 2013-05-06 17:14:41
我们通过实现数据分片解决了这个问题。
基本上,不深入代码细节:
shards parameter
即使我在上面说了所有的话,我还是不相信Solr是一个很好的选择。Solr并不是很适合在不断变化的索引上进行搜索,而且如果您主要通过ID进行搜索,则不需要搜索引擎。
对于我们的项目,我们基本上自己实现了所有的索引构建、负载平衡和查询引擎,并主要使用Solr作为存储。但我们开始使用Solr时,分片是flaky的,性能不佳,我不确定它现在的状态是什么。
最后,如果我今天从头开始构建这个系统,而没有我们在过去4年中所做的所有工作,我会建议使用缓存来存储当前在线的所有用户(比如memcached或redis),在请求时,我会简单地迭代所有用户,并根据条件过滤掉它们。条件过滤可以独立缓存并以增量方式更新,如果匹配逻辑非常简单,那么迭代5000条记录也不一定非常耗时。
发布于 2013-05-06 13:56:01
任何健壮的解决方案都将包括使您的数据接近SOLR (批处理)并在内部使用它。在搜索期间不运行非常大的请求,这是低延迟的事情。您应该开发自己的筛选器;筛选器会偶尔(比如每分钟)缓存在线用户的数据。如果数据更改非常频繁,请考虑实现PostFilter。
你可以在这里找到一个很好的过滤器实现的例子:http://searchhub.org/2012/02/22/custom-security-filtering-in-solr/
https://stackoverflow.com/questions/16315398
复制相似问题