3

我将 solr4 与 Autosuggest 一起使用(如此TermsComponent所述)我们正在执行一个正则表达式“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>
4

2 回答 2

3

这里的问题是,术语组件适用于搜索和查询的索引标记。因此,如果您进行 unicode 折叠(这就是您所做的),您将存储折叠的文本版本。您将匹配它没有重音,但您也将得到它没有重音。

我可以想到两个选择:

1)将折叠和非折叠项存储在一个字段中。所以以某种方式让“Têst áccènt”映射到“测试口音|Têst áccènt”。您匹配前缀“Test..”,然后在客户端上提取第二个术语。但是,如何做到这一点可能很棘手。

2) 改用Suggester。这建立在拼写检查器之上,并且 - 如果我正确阅读文档 - 允许指定替代 field_type,其分析器在建议者的索引/查询期间使用(使用 solrconfig.xml 中几乎没有记录的 queryAnalyzerFieldType 参数)。因此,您的原始文本以折叠形式复制到建议者中。但是,可以推测,一旦 Suggester 匹配了某些东西,它就会返回原始形式。但是,我不确定。主要是因为,它被宣传为刚刚诞生的 Lucene/Solr 4.1 AnalyzingSuggester 的一项功能。事实上,这篇文章专门介绍了您的用例:

使用折叠或规范化大小写、重音等的分析器(例如,使用 ICUFoldingFilter),建议将匹配而不管大小写和重音。例如,查询“ame...”会建议 Amélie。

问题是此时您需要自己编写一个完整的示例。指导很少。但它(AnalyzingSuggester)可能是你最好的选择。

于 2013-02-07T03:59:09.207 回答
2

您将需要创建一个自定义的 fieldType,可能类似于该text_en字段,但它也实现了ASCIIFilterFoldingFactory来处理索引和查询时的变音符号转换。

于 2013-02-06T17:21:46.517 回答