使用分面搜索在层次结构中向下钻取并省略当前选择之外的节点数据

时间:2015-07-26 11:08:01

标签: solr faceted-search

我的产品有以下结构,产品可能属于多个类别。在我的情况下,一个" caketopper",这将是" cake / caketoppers"以及" caketoppers" (在这个例子中,不要关注类别结构背后的逻辑)。

类别结构:

cake
    caketoppers
        funny

caketoppers
    funny

我想要的是当用户在0级(主要类别选择)上选择了一个类别时,在这种情况下' caketoppers',我不想返回属性/值相同的产品,因为它也属于不同的类别。 我尝试了以下查询,但它不断返回所有数据:

&f.slug_nl_0.facet.pre‌​fix=(caketoppers)&fq=slug_nl_0:"(caketoppers)"
&f.slug_nl_0.facet.pre‌​fix="caketoppers"&fq=slug_nl_0:"(caketoppers)"

我一直得到这个结果(为了更好的可读性而清理):

<result name="response" numFound="6" start="0">
    <doc>
        <arr name="slug_nl_0">
            <str>caketoppers</str>
            <str>cake</str>
        </arr>
    </doc>
</result>
<lst name="facet_counts">
    <lst name="facet_fields">
        <lst name="slug_nl_0">
            <int name="cake">6</int>
            <int name="caketoppers">6</int>
        </lst>
    </lst>  
</lst>  

但我希望的结果是:

<result name="response" numFound="6" start="0">
    <doc>
        <arr name="slug_nl_0">
            <str>caketoppers</str>
        </arr>
    </doc>
</result>
<lst name="facet_counts">
    <lst name="facet_fields">
        <lst name="slug_nl_0">
            <int name="caketoppers">6</int>
        </lst>
    </lst>  
</lst>      

&#39; slug_nl_0&#39;的字段定义在schema.xml中:
       

更新1

我尝试了一个更简单的查询,但我得到了完全相同的结果:

&facet.pre‌​fix=caketoppers&fq=slug_nl_0:caketoppers

更新2

我正在阅读分组:http://wiki.apache.org/solr/FieldCollapsing

所以我尝试在我的查询中添加它,但是我收到了错误:

&fq=slug_nl_0:taarttoppers&group=true&group.facet=true&group.field=slug_nl_0

错误:无法在多值字段上使用FieldCache:slug_nl_0

&fq=slug_nl_0:taarttoppers&group=true&group.field=slug_nl_0

错误:无法在多值字段上使用FieldCache:slug_nl_0

&fq=slug_nl_0:taarttoppers&group.facet=true&group.field=slug_nl_0

错误:将group.field指定为参数或本地参数

然后我在页面底部注意到了这一点:

  

已知限制支持对多值字段进行分组却没有   尚未实施。

在同一个Solr FieldCollapsing example page上,他们以百思买为例。现在我想知道如何在不支持多值字段的情况下实现它。

更新3

我现在正在尝试另一个选项PathHierarchyTokenizerFactory,这是其他人建议的,以支持分层导航。我在这里读到:https://lucene.apache.org/core/4_4_0/analyzers-common/org/apache/lucene/analysis/path/PathHierarchyTokenizerFactory.html

结束了这个:

    <fieldType name="descendent_path" class="solr.TextField">
       <analyzer type="index">
             <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter=">" /> 
       </analyzer>
       <analyzer type="query">
             <tokenizer class="solr.KeywordTokenizerFactory" />
       </analyzer>
     </fieldType>

我尝试了这些字段定义:

    <field name="categorystring_nl" type="string" indexed="true" stored="true" multiValued="true"/>
    <field name="categorystring_tokenized" type="descendent_path" indexed="true" stored="true" multiValued="true"/>

请求中的这些查询字符串参数(我现在还有更多类别):

  1. &amp; facet.field = categorystring_nl - &gt;这将返回一个基于完整分类字符串计数的方面,例如&#34;蛋糕&gt; caketoppers&gt;有趣&#34;,所以我不能将它用于最高类别的计数(在这种情况下&#34;蛋糕&#34;):
  2. <lst name="categorystring_nl">
      <int name="party>balloons">15</int>
      <int name="cake>caketoppers>funny">6</int>
      <int name="caketoppers>funny">6</int>
      <int name="accessories>tiaras">3</int>
    </lst>
    
    1. &amp; facet.field = categorystring_tokenized,现在返回:
    2. <lst name="categorystring_tokenized">
        <int name="party">15</int>
        <int name="party>balloons">15</int>
        <int name="cake">6</int>
        <int name="cake>caketoppers">6</int>
        <int name="cake>caketoppers>funny">6</int>
        <int name="caketoppers">6</int>
        <int name="caketoppers>funny">6</int>
        <int name="accessories">3</int>
        <int name="accessories>tiaras">3</int>
      </lst>
      

      我认为这是人们对标记化的期望数据?但是现在我仍然不知道如何从这些数据中轻松地提取层次结构,除非循环通过方面并计算&#34;&gt;&#34;在&#34;名称&#34;中出现用于确定层次结构中的实际级别并在构面中构建层次结构的属性。必须有更好的方法吗?

      我该怎么办?

1 个答案:

答案 0 :(得分:0)

应该设计搜索映射。不反映原始数据。

听起来我可能实际上想要将几乎相同的内容索引为多个条目,每个类别一个。 Solr非常有效地表示重复的索引数据(存储是一个不同的问题),所以你不必担心它的性能。

如果您需要重新规范这些多个结果,您可以查看分组和其他其他功能。