假设有多个文档的字段为clientID,其值范围为1到100.
查询1:
FQ: **clientID:1 OR clientID:2 OR clientID:3 or clientID:5 or clientID:7 or client ID:8**
查询2:
FQ: **clientID:[1 TO 3] or clientID:5 or clientID:[7 TO 8]**
问题:
- 这两个查询之间会有很大的性能差异吗?如果是,怎么样?
- 如果在多个OR中给出,SOLR是否不进行翻译此类范围值的预处理?
醇>
答案 0 :(得分:1)
可能有 - 取决于缓存的条目等。第二个查询将是两个范围查询和一个常规查询组合成三个布尔子句,而第一个将是六个不同的布尔子句。
对于您的示例,速度可能不会有太大差异,但随着子句数量的增加,后者将保持相交的集合数量低于第一个。要获得准确的数据 - 尝试一下 - 您的核心将与其他人的核心不同。
不,Solr不会预先处理任何事情。这已经移交给Lucene随心所欲,但是范围查询可以通过与精确字段查询不同的方式来解决。在您的纯布尔查询中给出的术语之间可以有条目,因此您无法将其转换为范围查询并期望相同的结果,并且您不能以相反的方式执行 - 因为该字段可能不是整数(甚至整数类型的索引方式不同)。
重要的部分通常是fq
将单独缓存,因此通常更重要的是让它可以跨查询重复使用。
答案 1 :(得分:0)
如果使用默认数值类型,Solr为每个数字索引多个精度,(在Solr field types中查找trieIntField和IntPointField
所以,当你索引15时,它将其索引为15和10,当你索引9时,它将其索引为9和0.当你搜索8 - 21范围时,它转换为搜索number[8] or number[9] or number[10] or number[20] or number[21]
(使用二进制范围而不是十进制,但我希望你能得到这个想法)。所以我建议你使用范围查询,让Solr管理优化。
PointField类型是TrieFields的替代品,在功能上类似,但使用其他数据结构来存储信息。因此,如果您有遗留索引,则可以使用triefields,但如果您要创建新索引,则建议使用PointFields。