2011-02-10 25 views
3

类似Google的自动补全的方法之一是将Solr 1.4中的带状疱疹和termvector组件结合起来。通过带状疱疹和termvector组件自动完成

首先,我们使用带状疱疹组件生成所有n元分布,然后使用termvector获得对用户词条序列的最接近的预测(基于文档频率)。

模式:

<fieldType name="shingle_text_fivegram" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
     <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" /> 
     <filter class="solr.ShingleFilterFactory" maxShingleSize="5" outputUnigrams="false"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 

Solr的配置:

<searchcomponent name="termsComponent" class="org.apache.solr.handler.component.TermsComponent"/> 
<requesthandler name="/terms" class="org.apache.solr.handler.component.SearchHandler"> 
    <lst name="defaults"> 
     <bool name="terms">true</bool> 
     <str name="terms.fl">shingleContent_fivegram</str> 
    </lst> 
    <arr name="components"> 
     <str>termsComponent</str> 
    </arr> 
</requesthandler> 

通过以上的设置,我需要禁用词的任何地方砸的正克的边缘,并保持它们中正内-gram序列。

让我们从序列“印度和中国”说,我需要按以下顺序:

india 
china 
india and china 

,并跳过休息。

它是否可与其他Solr组件/过滤器组合使用?

UPD:这里是(应该是可能的铁丝插入SOLR)在Lucene的4一种可能的解决方案:

“你不能做,只有在启动(第一令牌中删除停用词自定义阻滤波器( s)看到)还是输入结束(后面没有看到非停用词令牌)?它需要一些缓冲/状态保持(capture/restorteState),但看起来可行吗?迈克尔 - 麦坎德利斯

来自:http://blog.mikemccandless.com/2013/08/suggeststopfilter-carefully-removes.html

回答

1

做多字中的自动完成的Solr 1.4是EdgeNGramFilterFactory,因为你需要用户输入相匹配,因为他/她的类型是最好的办法。所以你需要匹配“我”,“中”,“印度”等建议印度。

+1

问题不是关于如何实现多字自动完成。这已经完成了。问题是,如何在搜索时放弃生成的n元组边界上的停用词。 – 2011-08-10 08:28:40

1

使用一个单独的查询分析器与KeywordTokenizerFactory,从而(使用你的例子):

 <analyzer type="index"> 
      <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" /> 
      <filter class="solr.ShingleFilterFactory" maxShingleSize="5" outputUnigrams="false"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" /> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
+0

感谢您的建议,我需要玩一些数据来测试。 – 2014-10-08 18:08:18