我的原始复合文本字段是在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”时会找到记录。
如何使用将使用特定语言规则的所有文本字段进行全文搜索,例如单数/复数?
答案 0 :(得分:0)
复制字段说明在进行任何处理之前应用,因此它是确定如何处理内容的目标字段的类型。
解决方案是为所有支持的语言提供不同的字段和字段类型,然后在qf
参数中包含这些字段名称 - 这样Solr将搜索所有字段,并为每个字段应用不同的规则取决于该领域的语言。
如果您想要更强大的处理(即只将内容索引到与您的定义匹配的字段中,而不是索引到所有字段而不管语言),您可以使用Solr的langid功能。