Solr中的复合文本字段如何支持语言规则?

时间:2018-02-14 09:50:52

标签: solr

我的原始复合文本字段是在schema.xml中设置的,如下所示:

<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
<copyField source="*_t" dest="text" maxChars="3000"/>

其中“_t”字段定义为:

<dynamicField name="*_t"  type="text_general"    indexed="true"  stored="true"/>

和“text_general”类型定义为:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

然后,当我使用edismax在查询中的 qf 中包含“text”时,将在所有带有后缀“_t”的字段中搜索 q 字符串

问题是所有文本字段的搜索都不使用特定于语言的规则。例如,如果我将 q 字符串设置为“endmills”,并且文本字段的值为“endmill”,记录不会显示在查询结果中。

为了解决这个问题,我尝试将复合字段设为特定语言类型。

<field name="text" type="text_en" indexed="true" stored="false" multiValued="true"/>

其中“text_en”是用英语规则定义的

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="lang/stopwords_en.txt"
            />
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="lang/stopwords_en.txt"
            />
    <filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

尽管如此,查询“endmills”并未找到包含值为“endmill”的文本字段的记录。

但是,当“fieldx_ten”的值为“endmill”时,“_ init”后缀定义为

<dynamicField name="*_ten"  type="text_en"    indexed="true"  stored="true" />

如果我在 qf 字符串中包含“fieldx_ten”,则在搜索“endmills”时会找到记录。

如何使用将使用特定语言规则的所有文本字段进行全文搜索,例如单数/复数?

1 个答案:

答案 0 :(得分:0)

复制字段说明在进行任何处理之前应用,因此它是确定如何处理内容的目标字段的类型。

解决方案是为所有支持的语言提供不同的字段和字段类型,然后在qf参数中包含这些字段名称 - 这样Solr将搜索所有字段,并为每个字段应用不同的规则取决于该领域的语言。

如果您想要更强大的处理(即只将内容索引到与您的定义匹配的字段中,而不是索引到所有字段而不管语言),您可以使用Solr的langid功能。