0

我想在我的网站上使用“自动完成”作为搜索引擎。

因此,我有一个名为 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 上引入一个属于停用词的词,则会应用过滤器并且该词没有出现: 在此处输入图像描述 但是当我在字段 text_autocomplete 上执行相同操作时,似乎该词就在那里并存储为术语,过滤器没有做任何事情...... 在此处输入图像描述

任何人都可以给我一个关于这两件事变得疯狂的线索吗?

4

1 回答 1

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

Copyfield的文档:-

原始文本从“源”字段发送到“目标”字段,然后调用任何为源字段或目标字段配置的分析器。

  • 停止过滤器似乎丢失了format="snowball",这似乎在分析中产生了影响。
    此外,通常建议在索引和查询时使用相同的分词器和过滤器,以便索引词与搜索词匹配。所以可能只想再次检查配置。
于 2013-05-16T11:13:29.953 回答