首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整理Solr中的短语拼写检查结果

整理Solr中的短语拼写检查结果
EN

Stack Overflow用户
提问于 2012-04-03 05:33:00
回答 2查看 3.8K关注 0票数 2

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

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

代码语言:javascript
复制
<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 error“-> "entre",”each“," dining”,"entre error“," casual ","entre error”。"entre休闲餐饮“类似于索引中的内容( "entree_casual_dining”),因此“entree_casual_dining”作为建议返回。太棒了。

假设查询包含一个品牌名称和一种产品类型,比如"entre休闲餐桌套装“。我们希望找到品牌名称的拼写更正并替换整个拼写错误的品牌,以返回建议"entree_casual_dining table set“。我认为Solr的collate功能可以很好地处理这个问题。然而,当我进入这个搜索时,Solr会找到正确的品牌建议,但它不会将其整理回结果中:

代码语言:javascript
复制
<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“,它会正确地把它整理回查询中。

当它试图从多个单词的瓦片中整理建议时,可能会出现什么问题?

EN

回答 2

Stack Overflow用户

发布于 2012-04-24 04:06:29

我会考虑更改您的分析器,使其更像这样:

代码语言:javascript
复制
 <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
EN

Stack Overflow用户

发布于 2012-04-03 10:40:25

我看到solr成功地整理了多个单词关键字的建议,没有任何问题。不过,我使用的是Solr 3.1。我遇到的一个问题是,当一个多单词关键字中的多个单词拼写错误时,solr会给出一些建议,然后当你打开"collate“时,拼写检查器会显示出多种组合--这就是问题变得更加棘手的时候。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9984154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档