Автозаполнение через черепицу и компонент термвектора

Один из способов реализовать автозаполнение, подобное Google, — объединить черепицу и компонент термвектора в Solr 1.4.

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

Схема:

<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):

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

из: http://blog.mikemccandless.com/2013/08/suggeststopfilter-carefully-removes.html


person D_K    schedule 10.02.2011    source источник


Ответы (2)


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

person Alexander Ramos Jardim    schedule 10.08.2011
comment
вопрос не в том, как реализовать автозаполнение из нескольких слов. Это уже сделано. Вопрос в том, как при поиске отбрасывать стоп-слова по краям сгенерированных n-грамм. - person D_K; 10.08.2011

Используйте отдельный анализатор запросов с 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>
person James Doepp - pihentagyu    schedule 07.10.2014
comment
спасибо за предложение, мне нужно поиграть с некоторыми данными, чтобы проверить это. - person D_K; 08.10.2014