Solr很容易为基于单词的内容编制索引,但是对位集有任何支持,
我应该从哪里开始?
感谢。
答案 0 :(得分:1)
目前没有任何内置功能。您可以在SOLR-1913中看到自2010年10月以来社区内的活动。附件插件似乎也可以工作,但它尚未进入Solr的主干,但是。
我知道和使用的另一种方式类似于Apache Solr: bitwise operations to filter search results中描述的方法。我在架构
中使用了多值string
或int
类型
<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
- 将成为
正如您所看到的那样,存在差异:整数不跟踪哪些位不存在而字符串不存在。哪种方法适合您的需求,取决于您的使用案例。如果您只需要知道哪个位存在,请选择整数。这将使您的索引更小。如果您还需要知道哪些位不存在,请选择字符串。
要查询这个很简单
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条款下。这是你应该记住的,因为我不知道你的位集有多大。