我将 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/

10-12 17:20