Автозаполнение с помощью дранки и компонента termvector - PullRequest
3 голосов
/ 10 февраля 2011

Один из способов выполнить автоматическое завершение, похожее на Google, состоит в том, чтобы объединить дранку и компонент termvector в Solr 1.4.

Сначала мы генерируем все n-граммовые распределения с помощью компонента shingles, а затем используем termvector, чтобы получить наиболее близкий прогноз к последовательности пользовательских терминов (на основе частоты документа).

Схема:

<fieldType name="shingle_text_fivegram" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.LowerCaseTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
        <filter class="solr.ShingleFilterFactory" maxShingleSize="5" outputUnigrams="false"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
</fieldType>

Solr config:

<searchcomponent name="termsComponent" class="org.apache.solr.handler.component.TermsComponent"/>
<requesthandler name="/terms" class="org.apache.solr.handler.component.SearchHandler">
    <lst name="defaults">
        <bool name="terms">true</bool>
        <str name="terms.fl">shingleContent_fivegram</str>
    </lst>
    <arr name="components">
        <str>termsComponent</str>
    </arr>
</requesthandler>

При описанной выше настройке мне нужно отбросить стоп-слова в любом месте по краям n-граммов и сохранить их в последовательности n-граммов.

Допустим, из последовательности «Индия и Китай» мне нужна следующая последовательность:

india
china
india and china

и пропустить остальные.

Возможно ли это в сочетании с другими компонентами / фильтрами Solr?

UPD: вот одно из возможных решений в Lucene 4 (должно быть возможно подключиться к SOLR):

"Не могли бы вы создать пользовательский стоп-фильтр, который удалял бы стоп-слова только в начале (первые замеченные токены) или в конце ввода (никаких жетонов без стоп-слов, видимых после)? / состояние хранения (capture / restorteState), но это кажется выполнимым? " - Майкл МакКэндлесс

от: http://blog.mikemccandless.com/2013/08/suggeststopfilter-carefully-removes.html

Ответы [ 2 ]

1 голос
/ 07 октября 2014

Используйте отдельный анализатор запросов с KeywordTokenizerFactory, таким образом (используя ваш пример):

        <analyzer type="index">
            <tokenizer class="solr.LowerCaseTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
            <filter class="solr.ShingleFilterFactory" maxShingleSize="5" outputUnigrams="false"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        </analyzer>
1 голос
/ 10 августа 2011

Лучший способ сделать автозаполнение из нескольких слов в Solr 1.4 - это EdgeNGramFilterFactory, так как вам нужно соответствовать вводу пользователя, когда он вводит его.Так что вам нужно сопоставить «i», «in» и т. Д., Чтобы предложить Индию.

...