整理短语拼写检查导致Solr

时间:2012-04-02 21:33:00

标签: solr spell-checking

这需要一些解释,但我认为这个讨论可以帮助任何在他们的Solr索引中有重要短语的人。

我正在使用Solr在电子商务环境中为搜索提供动力,而我正在尝试改进品牌名称的拼写检查建议。 Solr默认拼写单独检查每个单词,而不考虑结果短语是否有意义。例如,搜索“paula dean”会带回“你的意思是:paula bean吗?”,而品牌名称实际上是“Paula Deen”。目前,我的拼写字典是一个名为spellField的空白标记化字段。为了索引完整的品牌名称进行拼写检查,我的Solr导入用我的数据库中的下划线替换品牌名称中的空格,即Entree Casual Dining - > Entree_Casual_Dining。以下是spellField的fieldType的架构:

<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” - &gt; “entre”,“休闲”,“餐饮”,“休闲休闲”,“休闲餐饮”,“休闲餐饮”。木瓦“entre casual dining”类似于索引中的内容(“Entree_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>

当校正来自查询中的单个拼写错误的单词时,整理没有问题。例如,如果拼错“table”,它会将其正确地整理回查询。

当它试图整理多字组合的建议时会出现什么问题?

2 个答案:

答案 0 :(得分: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中删除。

答案 1 :(得分:0)

我见过solr成功整理多字关键字的建议,没有任何问题。我曾经使用过Solr 3.1。我遇到的一个问题是当多字关键字中的多个单词拼写错误并且有来自solr的建议时,当你打开“整理”时,拼写检查器会提供多种组合 - 这样当它变得棘手时。

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