我试图弄清楚如何配置 Solr 管理模式的 fieldType 以实现以下目标:
(a) 搜索非重音字符串时,结果将不区分重音。
(b)但是,在对重音字符串执行搜索时,结果将仅对重音敏感。
例如:
searchString -> expectedResult
Equipe -> Equipe, Equipé, Equipe, 等等...
装备 -> 装备
注意:通配符 (*) 无关紧要,所选单词仅用于演示目的。
由于一些要求限制,我的情况有点不常见,但使用我的模式(如下),我有 3 个字段;OName、OSearch、ONameSearch。(注意:OSearch 和 ONameSearch 在后端有不同的用途,所以需要单独定义) 目的是让我的 Solr 查询 OSearch 和 ONameSearch,并将 OName 返回给 UI。
我最初的理解是 OName 将存储原始值(“María”)并将其索引为不区分重音(“maria”),以便在没有 solr.ASCIIFoldingFilterFactory 的情况下进行查询时,将实现以下目标。
示例:{query} -> {OName = result}
q = OSearch:*equipe* OR ONameSearch:*equipe*
-> OName = Equipe、Equipé、Equipé 等
q = OSearch:*equipé* OR ONameSearch:*equipé*
-> OName = Equipé
到目前为止,这是我的架构......
<fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
<fieldType name="text_en_splitting_tight" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<analyzer>
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.EnglishMinimalStemFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
<field name="OName" type="lowercase" indexed="true" stored="true" />
<field name="OSearch" type="text_en_splitting_tight" indexed="true" stored="false" multiValued="true" />
<field name="ONameSearch" type="text_en_splitting_tight" indexed="true" stored="false" multiValued="true" />
<copyField source="OName" dest="OSearch" />
<copyField source="OName" dest="ONameSearch" />
请指教,谢谢!
我研究过的大多数(如果不是全部)相关资源
如何在 Solr 中忽略重音搜索
如何在 SOLR 搜索中忽略重音?
SOLR 和重音字符
Solr 重音删除
SOLR 使用重音字符轻松搜索
Solr 参考指南 6.6 定义字段
Solr 参考指南 6.6 复制字段