带变音符号的solr autosuggest

带变音符号的solr autosuggest,solr,tokenize,diacritics,autosuggest,Solr,Tokenize,Diacritics,Autosuggest,我将solr4与术语组件一起使用(如上所述) 我们正在执行一个regEx“startsWith”-搜索,它忽略大小写,整个搜索查询如下所示: <solr>/terms ?terms.fl=name &terms=true &terms.limit=5 &terms.regex=<term>.* &terms.regex.flag=case_insensitive &qt=%2Fterms 不幸的是,这个解决方案不能处理变音、变调和

我将solr4与术语组件一起使用(如上所述) 我们正在执行一个regEx“startsWith”-搜索,它忽略大小写,整个搜索查询如下所示:

<solr>/terms
?terms.fl=name
&terms=true
&terms.limit=5
&terms.regex=<term>.*
&terms.regex.flag=case_insensitive
&qt=%2Fterms
不幸的是,这个解决方案不能处理变音、变调和重音。。因此,以下方法行不通:

têst -> Test Listing; test lowercase; Têst áccènt
Test -> Test Listing; test lowercase; Têst áccènt
该字段是一个
字符串
——我也尝试过标记化的
测试,但没有成功

<field name="name" type="string" indexed="true" stored="true" required="true" />

启用此autosuggest的双向重音搜索的最佳方法是什么


编辑: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>

自动建议
org.apache.solr.spelling.Suggester
org.apache.solr.spelling.suggest.fst.AnalyzingLookupFactory
自动建议
真的
阿苏格
正文
真的
真的
自动建议
真的
5.
真的
自动建议



您需要创建一个自定义字段类型,可能类似于
text\u en
字段,但它也实现了在索引和查询时处理变音符号转换的功能。

这里的问题是,术语组件在索引标记上工作,用于搜索和查询。所以,如果您进行unicode折叠(这就是您所做的),您将存储折叠的文本版本。你将匹配它没有口音,但你也会得到它回来没有口音

我可以想出两个选择:

1) 将折叠和未折叠的术语存储在一个字段中。因此,不知何故,让“Têstáccènt”映射到“Test accent|Têstáccènt”。在前缀“Test..”处匹配,然后在客户端上提取第二个术语。但如何做到这一点可能很棘手

2) 改用。这建立在拼写检查器的基础上,如果我正确阅读了文档,则允许指定替代字段类型,其分析器在suggester的索引/查询过程中使用(在solrconfig.xml中使用几乎没有文档记录的queryAnalyzerFieldType参数)。因此,您的原始文本将以折叠形式复制到suggester中。但是,可以推测,一旦建议者匹配某个内容,它将返回原始形式。但是,我不确定。主要是因为,它被宣传为刚出生的Lucene/Solr4.1的一个特性。事实上,本文专门介绍了您的用例:

使用折叠或规范化大小写、重音等的分析器(例如。, 使用ICUFoldingFilter),建议将匹配,而不考虑 大小写和口音。例如,查询“ame…”将建议 艾米莉


问题是,在这一点上,您需要自己编写一个完整的示例。几乎没有什么指导。但它(AnalyzingSuggester)可能是你最好的选择。

谢谢Paige,我更新了第一篇文章,展示了所做的更改。我使用关键字标记器来检索整个术语(startsWith)。虽然这为
asug:“test n–me”
或任何其他低/高/重音变体检索正确的文档,但它不适用于autosuggest实现。你知道需要改变什么吗
terms.regex=Test.*
给我
测试名称
(应该返回
Têst Námè
),在regex中指定任何重音都不会给出任何结果:(我不确定需要修改什么才能使这项工作起作用。我以前没有使用过术语“组件”。在过去的AutoSuggest中,我遵循了wiki上的Suggester-outline,它基本上在封面下使用拼写检查。我尝试了AnalyzingSuggester,并将我的修改附在了我的第一篇文章中。)(我对查询分析器也有相同的配置,但是删除它并不会改变结果,所以我想它是不需要的)所以
tést
test
têst
都会返回
test name
,这很奇怪,因为asug只是一个名称的复制字段,甚至没有存储..?我随机得到它“正常工作”-建议者似乎总是返回索引字段值,而不是实际字段值。如果我在没有索引分析器的情况下输入文档,然后使用索引分析器重新启动,我会返回正确的字段。不幸的是,这显然不能用作最终解决方案:/n您确定从原始fi中删除了折叠分析器吗eld?据我所知,用于分析的文档Suggester非常明确地说,匹配正在分析(折叠)表单,但结果在原始的表面表单上。如果您不确定,我会检查从原始字段返回的令牌。我不确定copyField来自何处,对于简单的场景,您不应该需要它。我的理解(可能是错误的)是,您不需要copyField。您可以指向“字段”到原始字段,但也通过在suggestAnalyzerFieldType中提供类型来提供analyzer only链。它将自己复制内容。为了完整性,Sebastian的工作解决方案,从他在Alexandre推荐的。
  <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>