Solr Возможно, вы имели в виду (компонент проверки орфографии) - PullRequest
8 голосов
/ 29 февраля 2012

Я использую solr для своих приложений, и я интегрировал компонент проверки орфографии, но у меня есть некоторые проблемы:

Первый: Когда я набираю термин, разделенный пробелом, мне дают поправку за каждый термин

Например: "wat ters" => "what term" , но истинное значение составляет watters

Второй: Когда я набираю какую-то фразу с неправильным термином хотя остальные термины верны, они применяют заклинание ко всем терминам.

Например: " Различия в язык соглашения об использовании" => "Различия в использовании языка преобразования ".

Истина - «Различия в соглашениях об использовании языка»

Это мой конфиг в 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"/>

Буду признателен за вашу помощь

Приветствия

1 Ответ

1 голос
/ 29 февраля 2012

Для вашей первой проблемы вы можете использовать WordBreakSpellChecker

Что касается вашей второй проблемы, вы можете установить <str name="spellcheck.onlyMorePopular">true</str> в <str name="spellcheck.onlyMorePopular">false</str> и посмотреть, имеет ли это ожидаемый результат.

...