1

我希望复制一个字段,并在副本中应用一个额外的分析器。虽然我知道如何制作副本 ( <copyField source="source" dest="dest"),但我真正想做的是在副本上运行不同的分析器 (ASCIIFoldingFilterFactory)。

如何更改 copyField 的类型以便我可以运行该附加分析器?
我什至需要更改类型,还是只运行一个额外的分析器?

我相信我可以通过使用与复制字段名称匹配的动态字段来解决这个问题,然后以这种方式更改类型,但这不会创建我的数据的额外副本吗?

4

1 回答 1

4

您只需要定义一个新的 fieldType 并将您的 copyField 声明为该类型。

例如,下面text_syn是一个应用一组分析器text_stop_syn_stem的类型,是另一种类型,它有更多的分析器(用于去除停用词和词干):

<types>
    ...
    <fieldType name="text_syn" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>        
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
            <filter class="solr.LowerCaseFilterFactory"/>        
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
        </analyzer>
    </fieldType>

    <fieldType name="text_stop_syn_stem" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.PorterStemFilterFactory"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
            <filter class="solr.PorterStemFilterFactory"/>        
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
        </analyzer>
    </fieldType>
    ...
</types>

在我们得到的字段下:

<field name="name_syn" type="text_syn" indexed="true" stored="true" />
<field name="name_stop_syn_stem" type="text_stop_syn_stem" indexed="true" stored="false" />

和 copyField 是这样的:

<copyField source="name_syn" dest="name_stop_syn_stem" />
于 2013-07-19T16:36:28.087 回答