Spellcheck Solr:solr.DirectSolrSpellChecker配置

时间:2015-08-24 10:59:43

标签: solr lucene spell-checking

我正在尝试使用solr.DirectSolrSpellChecker(您不需要构建专用索引)来测试Solr 4.7.2的拼写检查功能。

我有一个名为" title"在我的索引;我使用了一个复制字段定义来创建一个名为" title_spell"的字段。要查询拼写检查(title_spell正确填写)。但是,在admin solr管理控制台中,我总是得到空的暗示。

例如:我有一个solr文件标题为" A B汽车&#34 ;;我进入管理控制台(拼写检查交叉并在输入字段spellcheck.q下)" atuomobile"。我希望至少得到一些类似于" A B汽车"或"汽车"但拼写检查的建议仍然是空的......

我的配置:

schema.xml(仅复制相关部分):

    <fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.StandardFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.SynonymFilterFactory" synonyms="de_DE/synonyms.txt" ignoreCase="true"
                    expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.StandardFilterFactory"/>
        </analyzer>
    </fieldType>
    ...
    <field name="title_spell" type="textSpell" indexed="true" stored="true" multiValued="false"/>

solr.xml(仅复制相关部分):

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
    <str name="queryAnalyzerFieldType">textSpell</str>
    <lst name="spellchecker">
        <str name="name">default</str>
        <str name="field">title_spell</str>
        <str name="classname">solr.DirectSolrSpellChecker</str>
        <str name="distanceMeasure">internal</str>
        <float name="accuracy">0.5</float>
        <int name="maxEdits">2</int>
        <int name="minPrefix">1</int>
        <int name="maxInspections">5</int>
        <int name="minQueryLength">4</int>
        <float name="maxQueryFrequency">0.01</float>
        <float name="thresholdTokenFrequency">.01</float>
    </lst>
</searchComponent>
...
<requestHandler name="standard" class="solr.SearchHandler" default="true">
    <lst name="defaults">
        <str name="defType">edismax</str>
        <str name="echoParams">explicit</str>
    </lst>
    <!--Versuch, das online datum mit in die Gewichtung zu nehmen...-->
    <lst name="appends">
        <str name="bf">recip(ms(NOW/MONTH,sort_date___d_i_s),3.16e-11,50,1)</str>
        <!--<str name="qf">title___td_i_s_gcopy^1e-11</str>-->
        <str name="qf">title___td_i_s_gcopy^21</str>
        <str name="q.op">AND</str>
    </lst>


    <arr name="last-components">
        <str>spellcheck</str>
    </arr>
</requestHandler>

我错过了什么?谢谢你的回答!

2 个答案:

答案 0 :(得分:1)

您的索引有多大?对于小型索引(想想少于几百万个文档),您将不得不调整accuracymaxQueryFrequencythresholdTokenFrequency。 (实际上,在较大的指数上也可能值得这样做。)

例如,我的150万doc索引使用以下设置:

      <float name="maxQueryFrequency">0.01</float>
      <float name="thresholdTokenFrequency">.00001</float>
      <float name="accuracy">0.5</float>

accuracy告诉Solr,在将其视为值得作为建议返回之前,结果需要多准确。

maxQueryFrequency告诉Solr这个词在索引之前需要经常发生的频率才能被视为值得作为建议返回。

thresholdTokenFrequency告诉Solr该术语在被认为值得作为建议返回之前必须包含哪些文件百分比。

如果您打算对多个词组使用拼写检查,则可能需要在ShingleFilter字段中添加title_spell

您可以尝试的另一件事是将queryAnalyzerFieldType设置为title_spell

答案 1 :(得分:0)

您能否尝试编辑requestHandler声明。

<requestHandler name="/standard" class="solr.SearchHandler" default="true">

并将网址查询为:

http://localhost:8080/solr/service/standard?q=<term>&qf=title_spell

首先用小术语进行实验并了解它的行为方式。这里的一个问题是它只返回以相同query term开头的所有术语。您可以使用匹配的FuzzyLookupFactory并返回模糊结果。有关详细信息,请查看solr suggester wiki