我将 solr4 与 TermsComponent
Autosuggest 一起使用(如 here 所述)
我们正在做一个 regEx "startsWith"-search,忽略大写/小写,整个 searchQuery 看起来像这样:
<solr>/terms
?terms.fl=name
&terms=true
&terms.limit=5
&terms.regex=<term>.*
&terms.regex.flag=case_insensitive
&qt=%2Fterms
让我给你举几个例子,它会返回什么:
test -> Test Listing; test lowercase
Test -> Test Listing; test lowercase
不幸的是,此解决方案无法处理变音符号、元音变音、重音……因此以下方法不起作用:
têst -> Test Listing; test lowercase; Têst áccènt
Test -> Test Listing; test lowercase; Têst áccènt
该字段是
string
- 我也尝试使用标记化的 test_en
,但没有成功<field name="name" type="string" indexed="true" stored="true" required="true" />
为此自动建议启用双向重音搜索的最佳方法是什么?
编辑:AnalyzerSuggester 的更改:
<searchComponent class="solr.SpellCheckComponent" name="autosuggest">
<lst name="spellchecker">
<str name="name">autosuggest</str>
<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
<str name="lookupImpl">org.apache.solr.spelling.suggest.fst.AnalyzingLookupFactory</str>
<str name="storeDir">autosuggest</str>
<str name="buildOnCommit">true</str>
<str name="field">asug</str>
<str name="suggestAnalyzerFieldType">text_asug</str>
<!-- Suggester properties -->
<bool name="exactMatchFirst">true</bool>
</lst>
</searchComponent>
<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/autosuggest">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">autosuggest</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.count">5</str>
<str name="spellcheck.collate">true</str>
</lst>
<arr name="components">
<str>autosuggest</str>
</arr>
</requestHandler>
.
<fieldType name="text_asug" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
</analyzer>
</fieldType>
最佳答案
这里的问题是术语组件适用于搜索和查询的索引标记。因此,如果您进行 unicode 折叠(这就是您所做的),您将存储折叠的文本版本。您将在没有重音的情况下匹配它,但随后您也将在没有重音的情况下将其恢复。
我能想到两个选择:
1) 将折叠和非折叠术语存储在一个字段中。所以不知何故让“Têst áccènt”映射到“测试口音|Têst áccènt”。您匹配前缀“Test..”,然后在客户端提取第二项。但是,如何做到这一点可能会很棘手。
2) 使用 Suggester 代替。这建立在拼写检查器之上,并且 - 如果我正确阅读文档 - 允许指定替代 field_type,其分析器在建议者的索引/查询期间使用(使用 solrconfig.xml 中几乎没有记录的 queryAnalyzerFieldType 参数)。因此,您的原始文本以折叠形式复制到建议器中。但是,可以推测,一旦 Suggester 匹配某些内容,它就会返回原始表单。但是,我不确定。主要是因为,它被宣传为刚刚诞生的 Lucene/Solr 4.1 AnalyzingSuggester 的一个特性。事实上,这篇文章专门介绍了您的用例:
问题是此时您需要自己组装一个完整的示例。很少有指导。但它 (AnalyzingSuggester) 可能是您最好的选择。
关于solr autosuggest 与变音符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14732713/