3

我想为我的应用程序实现 Solr 分层方面,其中 Category 和 SubCategory 之间有 2 级层次结构。我想使用http://wiki.apache.org/solr/HierarchicalFaceting#Pivot_Facets链接中提到的解决方案。

展平后的数据如下:

Doc#1: NonFic > Law
Doc#2: NonFic > Sci
Doc#3: NonFic > Sci > Phys

并且该数据应在索引时为层次结构的每个级别拆分为一个单独的字段。与下面相同。

索引词

Doc#1: category_level0: NonFic; category_level1: Law
Doc#2: category_level0: NonFic; category_level1: Sci
Doc#3: category_level0: NonFic; category_level1: Sci, category_level2:Phys

那么任何人都可以建议实现这一点的方法吗?我如何定义 Solr 模式来实现这一点?在索引时间,我找不到上述拆分数据的任何参考。

谢谢,

普里扬卡

4

2 回答 2

1

您是否需要将这些单独的字段显示为返回文档的一部分?在这种情况下,您需要在字段的“存储”版本中使用这些拆分值。如果您只需要在搜索或分面期间拥有它们,您可以忽略“存储”表单并专注于“索引”表单。

无论哪种情况,如果您需要将一个字段拆分为多个字段,您可以使用 copyField 或 UpdateRequestProcessor 来实现。

使用 copyField,所有字段的“存储”表单都是相同的,但是您可以为每个字段使用不同的处理器,为“索引”部分选择层次结构的不同部分。

使用 UpdateRequestProcessor,您可以编写一个自定义的,它接受一个字段,然后吐出几个字段,每个字段只有它的一部分路径。您可以做一个自定义或做几个字段副本,然后在每个字段上使用不同的正则表达式处理器。

于 2013-02-26T16:43:47.283 回答
0

要拆分数据,请使用ScriptTransformer,它允许您在配置文件中使用 Javascript 转换数据。

将以下内容添加到与数据源和文档相同级别的db-data-config中。这定义了一个函数,该函数在分隔符 > 上的字段中拆分字符串,并为每个拆分值添加一个字段,称为 category_level0、category_level1、...

<script><![CDATA[
    function CategoryPieces(row) {
        var pieces = row.get('ColumnToSplit').split('>');
        for (var i=0; i < pieces.length; i++) {
            row.put('category_level' + i, pieces[i]);
        }
        return row;
    }
]]></script>

然后在您的主<entity>标签中,添加transformer="script:CategoryPieces"并将列添加到您的字段列表中。

<field column="category_level0" name="Category_Level0" />
<field column="category_level1" name="Category_Level1" />

最后,在您的schema.xml中,添加新字段。

<field name="Category_Level0" type="string" indexed="true" stored="true" multiValued="false" />
<field name="Category_Level1" type="string" indexed="true" stored="true" multiValued="false" />
于 2014-05-02T17:35:26.067 回答