zoukankan      html  css  js  c++  java
  • solr特点四: SpellCheck(拼写检查)

    接下来,我将介绍如何向应用程序添加 “您是不是要找……”(拼写检查)。

    提供拼写建议

    Lucene 和 Solr 很久以前就开始提供拼写检查功能了,但直到添加了 SearchComponent架构之后,这些功能才可以无缝使用。现在您可以输入一个查询,让它不仅返回查询结果,并且为查询词语提供拼写建议(如果存在的话)。然后可以利用这些建议像 Google 那样显示 “您是不是要找……”,或者像 Yahoo! 那样显示 “请尝试……”。

    集成拼写检查的妙处在于它能够(而且必须)根据索引中的标记给出建议。也就是说,它不必根据词典给出正确拼写的词语,而是根据与查询词语相似的拼写给出拼写建议(包括错误拼写)。例如,假设很多很多的人都将单词 hockey错误拼写成 hockei。查询 hockey的用户很可能是想查找里面带有单词 hockei的文档,因为它们是相关的(尽管是这些文档的作者不会拼写)。

    SpellCheckComponent与 MLT 不同,它不需要在 solrconfig.xml 和 schema.xml 文件中进行配置。首先,模式必须先声明一个 Field和一个相关联的、其内容能够发挥拼写词典的作用的 FieldType。按常规,该 FieldType的分析过程要保持简单,而且不要派生词语或修改其他标志。我的样例 FieldType声明了它的 <analyzer>,如清单 11 所示:

    清单 11. 声明一个 <analyzer>
     <fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100" > 
      <analyzer> 
        <tokenizer class="solr.StandardTokenizerFactory"/> 
        <filter class="solr.LowerCaseFilterFactory"/> 
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      </analyzer> 
     </fieldType>

    该 <analyzer>负责基本的标志化(尤其是拆分空格),然后将标志变成小写并移除复制。不用派生词语,也不用扩展同义词。就是这么简单。接下来我在 schema.xml 文件中声明了一个 field,名为 spell,它使用 textSpell <fieldType>。接着,我声明了 <searchComponent>,将 solrconfig.xml 文件中的必要的部分连接起来,如清单 12 所示:

    清单 12. 声明 <searchComponent>
     <searchComponent name="spellcheck" class="solr.SpellCheckComponent"> 
        <str name="queryAnalyzerFieldType">textSpell</str> 
        <lst name="spellchecker"> 
          <str name="name">default</str> 
          <str name="field">spell</str> 
          <str name="spellcheckIndexDir">./spellcheckerDefault</str> 
        </lst> 
     </searchComponent>

    在这个例子中,我将前面声明的 textSpell <fieldType>和 queryAnalyzerFieldType关联起来。(注意,我使用前面讲述的 last-components技术将组件到 Dismax 和 solrconfig.xml 中的标准 SolrRequestHandler声明)。这能够确保正确分析输入查询,从而与拼写索引进行比较。其余的配置选项指定拼写检查器的名称、包含构建拼写索引所用的内容的 Field,以及索引在磁盘上的储存位置。

    完成全部配置之后,您必须构建拼写索引。这可以通过用 HTTP 向组件发送请求来完成,比如:

    http://localhost:8983/solr/rss/select/?q=foo&spellcheck=true&spellcheck.build=true

    拼写检查构建工作流程

    要查询拼写检查索引,必须先构建它。初始构建完成后,您需要确定(通过您的应用程序)重新构建索引的频率。您也可以在用 solrconfig.xml 中的 postCommit事件监听器完成提交之后再重新构建它。重构建的频率一定要以索引的更改数量为基准,但这一点并不是很重要,因为初始索引创建之后,很大地改动词典的可能性不大。

    构建了索引之后,像往常一样查询并添加 spellcheck=true参数就会返回建议了。例如,清单 13 打开了拼写检查特性:

    清单 13. 显示拼写检查的查询
     http://localhost:8983/solr/rss/select/?q=holr&spellcheck=true

    运行清单 13 中的查询会返回零个结果,但是它会提供以下建议:

     <lst name="spellcheck"> 
     <lst name="suggestions"> 
      <lst name="holr"> 
    	 <int name="numFound">1</int> 
    	 <int name="startOffset">0</int> 
    
    	 <int name="endOffset">4</int> 
    	 <arr name="suggestion"> 
    	 <str>solr</str> 
    	 </arr> 
      </lst> 
     </lst> 
     </lst>

    再深入一步,多个词语的查询也可以使用拼写检查。组件甚至能够自动地创建一个推荐的新查询,该查询将所有词语的最佳建议结合起来。这可以通过添加 spellcheck.collate=true参数来实现。就像在错误拼写查询中一样,

     http://localhost:8983/solr/rss/select/?q=holr+foo&spellcheck=true&indent=on 
     &spellcheck.collate=true

    它生成了作为建议的一部分的结果 <str name="collation">solr for</str>。但是要注意,这个合并的结果可能不会返回结果,这取决于您是否用 AND将查询词语连接起来。

    另外,拼写检查器还能采用与返回的建议数量和结果质量有关的查询参数。要想更多地了解 SpellCheckComponent的详细信息,请参见 参考资料中的 Solr wiki 页面链接。

  • 相关阅读:
    第二阶段团队冲刺第五天
    第二阶段冲刺七
    第二阶段冲刺六
    第二阶段冲刺五
    第二阶段冲刺四
    冲刺第二阶段三
    冲刺第二阶段二
    冲刺第二阶段 一
    项目总结
    第二阶段SCRUM
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/543ytrytry.html
Copyright © 2011-2022 走看看