如何正确使用solr上的复制字段进行自动完成

时间:2013-05-16 10:52:47

标签: solr autocomplete

我想在我的网站上使用“自动填充”搜索引擎。

所以,我有一个名为shortdesc的字段,其定义如下:

<field name="shortdesc" type="text_de" indexed="true" stored="false" />

字段类型:

<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index"> 
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LengthFilterFactory" min="3" max="20"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball" enablePositionIncrements="true"/>
        <filter class="solr.GermanNormalizationFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball" enablePositionIncrements="true"/>
        <filter class="solr.GermanNormalizationFilterFactory"/>
   </analyzer>
</fieldType>

所以,现在为了进行自动完成,我需要一个额外的字段(field_autocomplete),我将复制字段shortdesc。 该字段定义为(我不需要从该字段中检索数据):

<field name="field_autocomplete" type="text_autocomplete" indexed="true" stored="false" multiValued="true" />

类型定义:

<fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" enablePositionIncrements="true" />
        <filter class="solr.GermanNormalizationFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" enablePositionIncrements="true" />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="25"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
     </analyzer>
     <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" enablePositionIncrements="true" />
        <filter class="solr.GermanNormalizationFilterFactory"/>
        <filter class="solr.EnglishPossessiveFilterFactory"/>
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
</fieldType>

然后,复制字段:

    <copyField source="shortdesc" dest="field_autocomplete"/>

好的,那么,我的第一个问题:

  • 当建立索引时,字段text_autocomplete的所有内容都来自shortdesc的副本,这是否意味着处理字段shortdesc上的值然后复制到field_autocomplete?在这种情况下,我不需要在text_autocomplete类型上应用过滤器,因为它们与text_de相同,并且源已经应用了过滤器?这是正确的还是我必须为所有这些过滤器指定过滤器(对于我想要“捕获”的每个字段?

另一个问题:

  • 当我使用分析器时,如果我引入了一个属于禁用词的单词,则在字段text_de上应用过滤器并且不显示单词: enter image description here 但是当我在字段text_autocomplete上执行相同操作时,似乎单词存在并存储为术语,过滤器没有做任何事情...... enter image description here

有人能给我一些关于这两件事情变得疯狂的线索吗?

1 个答案:

答案 0 :(得分:3)

  • 您需要再次定义所有过滤器。源字段中没有任何内容被应用。

Copyfield的文档: -

  

原始文本从“source”字段发送到“dest”字段,   在为原始或目的地配置任何分析器之前   字段被调用。

  • 停止过滤器似乎缺少format="snowball",这似乎在分析中有所不同 此外,通常建议在索引和查询时使用相同的标记器和过滤器,以便索引的术语与搜索的术语匹配。所以可能只想再次检查配置。