【问题标题】:solr autosuggest with diacriticssolr 带有变音符号的自动建议
【发布时间】:2013-02-06 15:31:41
【问题描述】:

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

【问题讨论】:

    标签: solr tokenize diacritics autosuggest


    【解决方案1】:

    这里的问题是术语组件在索引标记上工作以进行搜索和查询。因此,如果您进行 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...”会建议 艾梅莉。

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

    【讨论】:

    • 我用 AnalyzingSuggester 进行了尝试,并将我的更改附加到我的第一篇文章中(我也有相同的查询分析器配置,但删除它并没有改变结果,所以我猜它不是需要)。看来我找回了规范化的字段(就像它存储在索引中一样)。所以tést、test、Têst 都回馈test name,这很奇怪,因为asug 只是名称的copyField,甚至没有存储..?
    • 我随机让它“工作” - 似乎 Suggester 总是返回 INDEXED 字段值而不是 ACTUAL 字段值。如果我在没有索引分析器的情况下提供文档,然后使用索引分析器重新启动,我会返回正确的字段。不幸的是,这显然不能用作最终解决方案:/
    • 您确定从 original 字段中删除了折叠分析器吗?据我所知,AnalyzingSuggester 的文档非常明确地说匹配是在分析(折叠)形式上,但结果是在原始表面形式上。如果您不确定,我会检查从原始字段返回的令牌。而且我不确定 copyField 来自哪里,对于简单的场景,你不应该需要它。
    • 我的理解(可能是错误的)是你不需要copyField。您将“字段”指向原始字段,但还通过在SuggestAnalyzerFieldType 中提供类型来提供仅限分析器的链。它会自行复制内容。
    • 为了完整起见,Sebastian 的工作解决方案here is a pastebin 来自他在Suggester page Alexandre 推荐的讨论中。
    【解决方案2】:

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

    【讨论】:

    • 感谢 Paige,我更新了第一篇文章以显示所做的更改。我正在使用 KeywordTokenizer 检索整个术语(startsWith)。虽然这会为asug:"test nâme" 或任何其他低/高/重音变体检索正确的文档,但它不适用于自动建议实现。知道需要改变什么吗? terms.regex=Test.* 给我test name(应该返回Têst Námè)并且在正则表达式中指定任何重音根本不会给出任何结果:(
    • 我不确定需要进行哪些更改才能使其正常工作。我以前没有使用过术语组件。在过去的 AutoSuggest 中,我遵循了 Suggester - wiki 上的 wiki.apache.org/solr/Suggester 大纲,它实际上在幕后使用了 SpellCheck。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多