Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Solr层次编号_Solr_Lucene - Fatal编程技术网

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>