2012-04-02 60 views
2

这需要一些解释,但我认为这个讨论可以帮助任何人在Solr索引中使用重要短语。整理短语拼写检查结果Solr

我正在使用Solr在电子商务环境中进行搜索,并试图改进品牌名称的拼写检查建议。默认情况下,Solr会单独检查每个单词,而不考虑结果词组是否有意义。例如,搜索“paula dean”会带回“您的意思是:paula bean?”,而品牌名称实际上是“Paula Deen”。目前,我的拼写字典是一个名为spellField的空白标记字段。为了为拼写检查指定完整的品牌名称,我从我的数据库的品牌名称中使用我的Solr导入替换空格,即下划线,即Entree Casual Dining - > Entree_Casual_Dining。下面是spellField的字段类型的模式:

<fieldType name="spellcheckquery" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.PatternReplaceFilterFactory" pattern="(\s[0-9]+\s)|(^[0-9]+\s)|(\s[0-9]+$)|(^[0-9]+$)" replacement="" replace="all"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.PatternReplaceFilterFactory" pattern="(\s[0-9]+\s)|(^[0-9]+\s)|(\s[0-9]+$)|(^[0-9]+$)" replacement="" replace="all"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="4" outputUnigrams="true"/> 
    </analyzer> 
</fieldType> 

把下划线的品牌名称是我能想到的,以保持多字的品牌视为单个标记的空白标记化领域的最佳途径。在返回后,我可以轻松地删除下划线的返回拼写建议。因此,现在,当查询进入时,Solr对查询进行了细化处理,并为每个拼图寻找拼写建议,即搜索拼写错误的品牌:“entre casual dining” - >“entre”,“casual”,“餐饮“,”休闲娱乐“,”休闲餐饮“,”休闲餐饮“。 “entre_casual_dining”这个牌子的“entre_casual_dining”类似于索引中的内容(“Entree_Casual_Dining”),因此建议。大。

假设查询包含品牌名称和产品类型,如“entre casual dining table set”。我们希望找到品牌名称的拼写更正并替换整个拼写错误的品牌以返回“entree_casual_dining表格集”建议。我认为Solr的整理功能可以很好地处理这个问题。当我进入这个搜索,不过,Solr的找到正确的品牌的建议,但它不整理它放回结果:

<response> 
    <lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">48</int> 
    </lst> 
    <result name="response" numFound="100" start="0"/> 
    <lst name="spellcheck"> 
    <lst name="suggestions"> 
     **<lst name="entre casual dining">** 
     <int name="numFound">1</int> 
     <int name="startOffset">0</int> 
     <int name="endOffset">19</int> 
     <int name="origFreq">0</int> 
     <arr name="suggestion"> 
      <lst> 
      **<str name="word">entree_casual_dining</str>** 
      <int name="freq">21</int> 
      </lst> 
     </arr> 
     </lst> 
     <bool name="correctlySpelled">false</bool> 
     **<str name="collation">entre casual dining table set</str>** 
    </lst> 
    </lst> 
</response> 

它有没有问题整理时校正从一个单一的拼写错误的单词查询出来。例如,如果拼错“表”,它会将它整理回查询中。

当它试图整理来自多字词拼图的建议时会发生什么问题?

回答

0

我已经看到solr成功整理了关于多词关键词的建议,没有任何问题。我曾经使用过Solr 3.1。我遇到的一个问题是多字词关键字中的多个单词拼写错误,并且有来自solr的建议,然后拼写检查程序提供了多个组合,这些拼写检查程序在打开“整理”时会出现 - 因此,当它变得更加棘手时。

即使在您的场景中使用“_”,我认为它可能会变得复杂,这取决于单词拼写错误的程度,因为它会将“_”也视为单词的一部分,并将其用于计算。只是想知道它的工作是否像你期望的那样工作,因为木瓦厂也会产生破碎的木瓦。

+0

确实,有一些意想不到的行为。你认为有什么方法可以在我的拼写检查字段中放置完整的品牌名称标记,而该字段中的其他条款是用空格标记的?你能举出一个Solr整理多词关键词的例子吗?感谢您的答复! – 2012-04-03 13:31:42

1

我会考虑改变你的分析看起来更像这样:

<analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
<analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="0" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer>  

通过preserveOriginal设置为1,将令牌化的品牌名称既是个人的话,并作为一个大标志。另外,我相信Shingle的东西已经被弃用,并预定在4.0版本中删除。