Solr层次编号
上的示例显示了一种索引层次结构节点:Solr层次编号,solr,lucene,Solr,Lucene,上的示例显示了一种索引层次结构节点: Doc#1: 0/NonFic, 1/NonFic/Law Doc#2: 0/NonFic, 1/NonFic/Sci Doc#3: 0/NonFic, 1/NonFic/Hist 如何为路径编制索引以实现这一点?我是手动分割路径、计算节点数、自己生成这些术语并将它们存储为Solr(多值字段)中的数组,还是可以配置为应用索引本身 为了便于参考,我考虑生成如下路径: public class DocumentPathBuilder { privat
Doc#1: 0/NonFic, 1/NonFic/Law
Doc#2: 0/NonFic, 1/NonFic/Sci
Doc#3: 0/NonFic, 1/NonFic/Hist
如何为路径编制索引以实现这一点?我是手动分割路径、计算节点数、自己生成这些术语并将它们存储为Solr(多值字段)中的数组,还是可以配置为应用索引本身
为了便于参考,我考虑生成如下路径:
public class DocumentPathBuilder {
private List<String> nodes = new ArrayList<>();
public static DocumentPathBuilder newInstance() {
return new DocumentPathBuilder();
}
public static String escapeText(String input) {
if (input == null)
throw new NullPointerException("Cannot escape null input!");
return input.replaceAll(ESearchDocumentPath.HIERARCHY_SEPERATOR, "").toUpperCase().trim();
}
public DocumentPathBuilder add(String node) {
nodes.add(escapeText(node));
return this;
}
public DocumentPathBuilder add(Collection<String> nodes) {
this.nodes.addAll(nodes.stream()
.map(n->escapeText(n))
.collect(Collectors.toList())
);
return this;
}
public List<String> build() {
List<String> result = new ArrayList<>();
for (int i = 0; i < nodes.size(); i++) {
StringJoiner joiner = new StringJoiner(ESearchDocumentPath.HIERARCHY_SEPERATOR);
joiner.add(""+i);
for (int j = 0; j <= i; j++) {
joiner.add(nodes.get(j));
}
result.add(joiner.toString()+ESearchDocumentPath.HIERARCHY_SEPERATOR);
}
return result;
}
}
还有,有什么区别?如果我将生成的值存储在多值字段中,如果Solr使用路径标记器生成它,我会得到相同的结果吗?来自您所引用的页面: 为了创建facet.prefix方法所需的令牌,您必须对该平坦数据执行一些索引时间处理。索引数据时,我们会创建特殊格式的术语,对作为路径一部分出现的每个节点的深度信息进行编码,并包括由公共分隔符(“深度/第一级术语/第二级术语/等”)分隔的层次结构。我们还为原始数据中的每个祖先添加了额外的术语 因此,这不是内置于路径层次标记器中的,该示例还显示了生成的标记的外观(并且不存在
n
值):
中的:“c:\usr\local\apache”
Out:“c:”、“c:/usr”、“c:/usr/local”、“c:/usr/local/apache”
从您正在引用的页面: 为了创建facet.prefix方法所需的令牌,您必须对该平坦数据执行一些索引时间处理。索引数据时,我们会创建特殊格式的术语,对作为路径一部分出现的每个节点的深度信息进行编码,并包括由公共分隔符(“深度/第一级术语/第二级术语/等”)分隔的层次结构。我们还为原始数据中的每个祖先添加了额外的术语 因此,这不是内置于路径层次标记器中的,该示例还显示了生成的标记的外观(并且不存在
n
值):
中的:“c:\usr\local\apache”
Out:“c:”、“c:/usr”、“c:/usr/local”、“c:/usr/local/apache”
我是否应该只将其存储在多值字段中,这与我使用
PathHierarchyTokenizerFactory时的情况相同?是的,应该是相同的。我是否应该只将其存储在多值字段中,这与我使用PathHierarchyTokenizerFactory时的情况相同?是的,应该是相同的。
List<String> build = DocumentPathBuilder.newInstance()
.add("A")
.add("350")
.add(Arrays.asList("350-01", "FIGUTZRg"))
.build();
0 = "0>A>"
1 = "1>A>350>"
2 = "2>A>350>350-01>"
3 = "3>A>350>350-01>FIGUTZRG>"
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="\" replace="/"/>
</analyzer>
</fieldType>