Solr 你的意思是(拼写检查组件)

Posted

技术标签:

【中文标题】Solr 你的意思是(拼写检查组件)【英文标题】:Solr Did you mean (Spell check component) 【发布时间】:2012-03-18 20:58:40 【问题描述】:

我在我的应用程序中使用了 solr,并且我集成了拼写检查组件,但我遇到了一些问题:

首先: 当我输入一个以空格分隔的术语时,他们会给我每个术语的更正

例如:"watters" => "what term" 但真实的是 watters

第二: 当我输入一些带有错误术语的短语时。尽管其他术语是正确的,但它们对所有术语都应用了该咒语。

Eg : "Difreences in lankuage 使用约定" => "语言差异使用conversions".

真实的是“语言使用约定的差异”

这是我在 solrconfig.xml 中的配置:

<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">spellchecker</str>
            </lst>
</searchComponent>

<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
            <lst name="defaults">
                <str name="spellcheck.onlyMorePopular">true</str>
                <str name="spellcheck.extendedResults">false</str>
                <str name="spellcheck.count">1</str>
            </lst>
            <arr name="last-components">
                <str>spellcheck</str>
            </arr>
</requestHandler>

Schema.xml:

字段类型:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.StandardTokenizerFactory"/>
                <filter class="solr.LowerCaseFilterFactory"/>
                <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1"/>
                <filter class="solr.ASCIIFoldingFilterFactory" />
                <filter class="solr.SnowballPorterFilterFactory" language="English"/>
                <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.StandardTokenizerFactory"/>
                <filter class="solr.LowerCaseFilterFactory"/>
                <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
                <filter class="solr.ASCIIFoldingFilterFactory" />
                <filter class="solr.SnowballPorterFilterFactory" language="English"/>
                <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
            </analyzer>
            <analyzer type="multiterm" >
                <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                <filter class="solr.ASCIIFoldingFilterFactory" />
            </analyzer>
        </fieldType>


    <fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
                <analyzer type="index">
                   <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                     <filter class="solr.LowerCaseFilterFactory"/>
                     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
                     <filter class="solr.StandardFilterFactory"/>
                     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
                </analyzer>
                <analyzer type="query">
                     <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
                     <filter class="solr.LowerCaseFilterFactory"/>
                     <!--<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>-->
                     <filter class="solr.StandardFilterFactory"/>
                     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
                </analyzer>
            </fieldType>

字段:

<field name="title" type="text" indexed="true" stored="true" termVectors="true"/>
<field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/>

复制字段

<copyField source="title" dest="spell"/>

感谢您的帮助

干杯

【问题讨论】:

很好的问题...您是否有任何教程可以用来了解有关 lucene 的更多信息...除了 Solr 页面的官方文档吗?泰 @Sebastian:基础教程:Solr in 5 minutes,Apache Lucene quick-start guide。 高级教程: Dzone Solr Tutorial。 示例: solr Drupal for Drupal、Apache Solr for WordPress、Solr php Manual。祝你好运,我希望它有所帮助;) 书籍: Lucene and Solr: The Definitive Guide, Apache Solr 4 Cookbook. 【参考方案1】:

对于您的第一个问题,您可以使用WordBreakSpellChecker

至于您的第二个问题,您可以将 &lt;str name="spellcheck.onlyMorePopular"&gt;true&lt;/str&gt; 设置为&lt;str name="spellcheck.onlyMorePopular"&gt;false&lt;/str&gt;,看看是否有预期的结果。

【讨论】:

嗨 Klein,感谢您的回复,我正在使用 appach-solr3.5 与 php 进行交互。你能告诉我如何使用这个补丁吗?干杯 WordBreakSpellChecker 在 appach-solr3.5 中是标准的吗? 这不是标准的。您需要将其应用于源并构建新的 jar/war。 嗨,我是 Windows 平台上的 php 编码器,所以 java 开发对我来说是新的。你能告诉我如何在 apach-solr 上构建新的 jar/war 搜索后我找到了 spellCheckComponent.class 文件,但是有 spellCheckComponent.java 文件 我打开了 /dist 路径上的 apache-solr-3.5.0.war

以上是关于Solr 你的意思是(拼写检查组件)的主要内容,如果未能解决你的问题,请参考以下文章

solr入门之solr的拼写检查功能的应用级别尝试

技巧118 对你的工作进行拼写检查

智能提示 Solr (suggest)

Win7访问共享文件夹提示“请检查名称的拼写”怎么办

word文档里出现红线和绿线是啥意思?

通过 HTML/css 关闭 Chrome/Safari 拼写检查 [重复]