我正在使用Solr 6.3.0和java CloudSolrClient,它接受zookeeper url。
我有一个5节点的Solr云集群,每个节点有2个分片和1个副本,即总共20个分片
我需要通过查询Solr定期更新一些数据,我每天必须运行大约300万次查询,
我的查询如下:
获取唯一ID:
获取字段值的termfreq(),使用max tf获取最高值(2或3)
触发查询其他ID最少的距离b / w该字段中的特定值按其排序以获得相似的ID。
例如:
fq将如下:
(field_name:value_1 OR field_name:value_2 OR field_name:value_3 OR field_name:value_4 OR field_name:value_5)"
将param排序为:
{!func}dist(4,termfreq('field_name','value_0'),termfreq('field_name','value_1'),termfreq('field_name','value_2'),termfreq('field_name','value_3'),termfreq('field_name','value_4'),5,4,6,3,2) asc"
此处5,4,6,3,2从第1次查询为value_1,value_2获得5的最高tf。
1需要几毫秒 2第一次需要120ms
我需要从第二个查询获得1000行,每300万
任何调整都可以帮助我减少这个?
我尝试过Threadpool,平均时间为1次查询150ms 尝试使用带有10个exec的spark,但奇怪的是它比线程池花了更多的时间。
我监控了所有5个节点,所有这些节点的CPU使用率非常高(查询时),但是内存消耗很低(30 GB中最大9GB),我将堆设置为 - Xms是8GB,Xmx是15GB。
过滤器缓存为512mb(初始)-2GB(大小)。
我已经尝试了很多调整,仍然无法减少查询次数,我无法并行化这部分代码。感谢。