2013-02-06 137 views
3

我使用solr4与TermsComponent自动提示Solr的自动提示(如描述here) 我们正在做一个正则表达式“startsWith” - 搜索,忽略上/下-情况下,整个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 

不幸的是,这个解决方案不能处理变音符号,umlaute,口音..所以下面将不起作用:

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> 

回答

3

这里的问题是术语组件对编入索引的标记都适用于搜索和查询。所以,如果你做unicode折叠(这是你所做的),你将存储折叠文本版本。你可以不加重音地匹配它,但是你也可以在没有重音的情况下重新获得它。

我能想到的两个选项:

1)店铺折叠,在一个领域中的非折叠项。因此不知何故将“Têstáccènt”映射到“Test accent |Têstáccènt”。您在前缀“Test ..”处匹配,然后在客户端提取第二个术语。如何做到这一点可能会很棘手。

2)改为使用Suggester。这建立在拼写检查器之上,并且 - 如果我正确地阅读文档 - 允许指定替代field_type,其分析器在提示器的索引/查询过程中使用(在solrconfig.xml中使用勉强记录的queryAnalyzerFieldType参数)。因此,您的原始文本将以折叠形式复制到提示器中。但是,可以推测,一旦建议者匹配某件事物,它将返回原始形式。但是,我不确定。主要是因为它被宣称为刚出生的Lucene/Solr 4.1 AnalyzingSuggester的一个功能。事实上,本文明确覆盖你的使用情况:

随着其折叠或正常化的情况下,修饰等(例如,使用 ICUFoldingFilter),的建议将匹配而不管 壳体和重音的分析仪。例如,查询“ame ...”会提示 Amélie。

问题在于,您需要自己在此完成一个完整的示例。几乎没有指导。但它(分析结果)可能是你最好的选择。

+0

我用分析结构试验过它,并将我的修改附加到了我的第一篇文章中(我对查询分析器也有相同的配置,但是删除它并没有改变结果,所以我猜这是不需要的)。所以'tést','test','Têst'都会返回'test name',这很奇怪,因为asug只是一个copyField的名字,甚至没有存储..? –

+0

我随机得到它“工作” - 似乎是这样的建议ter总是返回INDEXED字段值而不是实际字段值。 如果我在没有索引分析器的情况下提供文档,那么使用索引分析器重新启动,我找回正确的字段。不幸的是,这显然不能用作最终解决方案:/ –

+0

您确定已从_original_字段中删除折叠分析器吗?据我所知,AnalysisSuggester的文档非常具体地说,匹配是在分析(折叠)的形式,但结果是在原始的表面形式。如果您不确定,我会检查从原始字段返回的令牌。 而我不确定copyField来自哪里,对于简单的场景你不应该需要它。 –

2

您需要创建一个自定义字段类型,也许类似text_en领域,但也实现了ASCIIFilterFoldingFactory来处理,在索引和查询时间变音符号转换。

+0

感谢Paige,我更新了第一篇文章以显示所做的更改。我使用KeywordTokenizer来检索整个术语(startsWith)。 尽管此检索“asug:”testnâme“'或任何其他较低/较高/重音变体的正确文档,但它不适用于autosuggest实现。任何想法什么需要改变? 'terms.regex = Test。*''给我'test name'(应该返回'TêstNámè')并且在正则表达式中指定任何口音都不会给出任何结果:( –

+1

我不确定需要更改什么我之前没有使用过TermsComponent,在过去的AutoSuggest中,我遵循了wiki上的Suggester - http://wiki.apache.org/solr/Suggester大纲,基本上使用了SpellCheck 。 –