Solr索引支持位集?

时间:2013-12-20 02:46:02

标签: solr

Solr很容易为基于单词的内容编制索引,但是对位集有任何支持,

  • 每个位都被单独索引(可能)
  • 支持使用普通编程语言中的多位bit操作查询它们
  • 比特的长度可能很长,最好是索引上没有硬的最大长度
  • 我不介意将这些位表示为字符串,如果必须,但位会更紧凑并且可能具有更好的性能。

我应该从哪里开始?

感谢。

1 个答案:

答案 0 :(得分:1)

目前没有任何内置功能。您可以在SOLR-1913中看到自2010年10月以来社区内的活动。附件插件似乎也可以工作,但它尚未进入Solr的主干,但是。


我知道和使用的另一种方式类似于Apache Solr: bitwise operations to filter search results中描述的方法。我在架构

中使用了多值stringint类型
<fields>
    <!-- other fields -->
    <field name="ints" type="int" 
        indexed="true" stored="true" multiValued="true" />
    <field name="strings" type="string"
        indexed="true" stored="true" multiValued="true" />
</fields>

要使用此功能,请将整数转换为Integer列表或String列表,其中列表的每个值都代表位位置。如果需要将其挂钩到DataImportHandler,可以使用Solr's ScriptTransformer

List<Integer> integers = new ArrayList<>();
List<String> strings = new ArrayList<>();

String binaryString = Integer.toBinaryString(i);

for(int c = 0; c < binaryString.length(); c++) {
    if(binaryString.charAt(c) == '1') {
        integers.add(c);
        strings.add(c + "_1");
    } else {
        strings.add(c + "_0");
    }
}

例如5 - 二进制中的101 - 将成为

  • 整数:[4,1]
  • 字符串:[4_1,2_0,1_1]

正如您所看到的那样,存在差异:整数不跟踪哪些位不存在而字符串不存在。哪种方法适合您的需求,取决于您的使用案例。如果您只需要知道哪个位存在,请选择整数。这将使您的索引更小。如果您还需要知道哪些位不存在,请选择字符串。

要查询这个很简单

  • 整数:q=ints:(1 OR 4)
  • 字符串:q=strings:(1_1 OR 4_1)

如果要排除某个位,则会绑定到字符串

  • strings:((1_1 OR 4_1) AND 2_0)

这种方式的警告 maxBooleanClauses 。大多数人都不知道,直到他们击中它。默认为1024个子句,您可以看到in Solr's Wiki。您也可以在solrconfig.xml中更改它。但是你设置这个值越大,你的查询就越多,Solr就越慢。

到目前为止,我们没有遇到与此相关的性能问题。但我们保持在1024条款下。这是你应该记住的,因为我不知道你的位集有多大。