如何在Solr中使用SynonymFilterFactory和ShingleFilterFactory?

时间:2015-02-13 16:05:38

标签: solr lucene

我想要达到的目的是寻找除臭喷雾'匹配'止汗喷雾' deo spray'等

我使用SynonymFilterFactory在索引时为除臭剂,除臭剂和止汗剂添加同义词。我可以在分析仪中看到它正常工作。

在此之后,我运行了一个ShingleFilterFactory(maxShingleSize =" 3")来分割成单词的组合。这再一次给了我正确的结果,例如分析'测试木瓦短语'给出:

  • 测试
  • test shingle
  • 测试木瓦短语
  • 木瓦
  • shingle phrase
  • 短语

这是期望的结果。当我将同义词术语与带状疱疹结合使用时会出现问题。例如,搜索除臭喷雾'应该给我:

  • 除臭喷雾
  • deo spray
  • 止汗喷雾

我所有的同义词。但我实际看到的是:

  • 除臭剂
  • deodorant deo
  • deodorant deo止汗剂
  • DEO
  • deo止汗剂
  • deo止汗喷雾
  • 止汗
  • 止汗喷雾

这显然也是从每个同义词术语中产生带状疱疹。我尝试过更换过滤器工厂的订单,但似乎无法让它工作。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您唯一能做的就是使用不扩展的同义词过滤器 - 将所有同义词减少到列表中第一个的同义词。然后你必须在索引时和查询时使用它。

此类方法不会导致documentation中描述的问题,因为您还必须在索引上应用过滤器。

  

考虑以下情况:

     
      
  • 带有"文字"的索引字段,在查询时使用SynonymFilter与同义词TV,Televesion并展开=" true"
  •   
  • 包含术语" text:TV"
  • 的数千个文档   
  • 包含术语"文字:电视"
  • 的几百个文件   
     

对文本的查询:电视将扩展为(文本:电视文本:电视)和较低的docFreq文本:电视将提供与电视"电视"一个更高的分数然后匹配" TV"相比之下 - 这可能与客户有点相反。索引时间扩展(或缩减)将导致所有文档的idf相同,无论原始文本包含哪个术语。

但是,如果您想支持多文字同义词,则可能仍会遇到问题,如文档中所述。

我不知道由同义词组成的带状疱疹是否会影响搜索结果,但如果没有,那么只有它花费的是索引中的额外空间,所以请考虑是否要保存它。