Цепочка Lucene Analyzer: ShingleFilter без токенов-наполнителей

В моей цепочке анализаторов ShingleFilter идет после фильтра стоп-слов. Как указано в документах, ShingleFilter обрабатывает приращения позиции > 1, вставляя токены-заполнители (токены с текстом термина "_").

For example : "please divide this sentence into biword shingles" 

Shingles of size 2 : please divide, divide _, _ sentence, sentence _, _ biword, biword shingles (assuming that "this, "into" are stopwords)

Я хотел бы удалить эти черепицы с помощью токенов-заполнителей, т.е. мой желаемый вывод содержит только: пожалуйста, разделите черепицу из двух слов.

У меня есть специальное поле для фасеток с опоясывающим лишаем до 4 грамм. Из-за этих стоп-слов все ограничения аспектов (или значения) выглядят бесполезными с такими наполнителями, как "разделить _ предложение _"

Пожалуйста, не могли бы вы направить меня.

Использование Solr 4.4.

ОБНОВИТЬ

Я думал установить для параметра enablePositionIncrement значение false в конфигурации StopFilter. Не уверен, решает ли это проблему или нет, но Lucene 4.4 больше не поддерживает это.


person phanin    schedule 19.09.2013    source источник
comment
Установка enablePositionIncrement в false была определенно правильной идеей, да. Для меня было новостью, что он больше не поддерживается.   -  person femtoRgon    schedule 19.09.2013


Ответы (3)


Добавьте PatternReplaceFilterFactory в цепочку анализаторов после ShingleFilterFactory. Замените все токены, содержащие токен-заполнитель, пустой строкой, т. е. "".

Это может временно решить вашу проблему, но для постоянного решения придется написать собственный анализатор или настроить ShingleFilter.

Тип поля образца:

<fieldType name="text_general_shingle" class="solr.TextField" positionIncrementGap="100">     
        <analyzer>
       <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />       
        <filter class="solr.LowerCaseFilterFactory"/>           
        <filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>
        <filter class="solr.PatternReplaceFilterFactory" pattern=".*_.*" replacement=""/>       
    </analyzer>     
    </fieldType>
person GS Majumder    schedule 19.09.2013
comment
блестящий, работает как шарм. Я собирался написать FilteringTokenFilter, чтобы удалить все токены с этим шаблоном. Теперь я знаю, что он доступен из коробки для целей тестирования (только), поскольку мне в конечном итоге придется избавиться от пустых токенов, испускаемых PatternReplaceFilter. - person phanin; 19.09.2013
comment
привет @phani .. Другим решением может быть: не применять StopWordsFilter и удалять черепицы, которые начинаются со стоп-слов или заканчиваются стоп-словами, используя подходящий шаблон регулярного выражения в PatternReplaceFilter... Можно попробовать для целей тестирования... :) - person GS Majumder; 19.09.2013
comment
Улучшение: используйте ShingleFilterFactory с fillerToken="___", затем используйте для замены pattern=".*___.*". Это гарантирует, что токен пользователя с _ не будет проигнорирован. - person Jack Miller; 26.09.2017

PositionFilter следует работа. Он устарел (см. Lucene документации, почему), но это должно работать.

...
<filter class="solr.LowerCaseFilterFactory"/>           
<filter class="solr.PositionFilterFactory" positionIncrement="1"/>       
<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>

Конечно, убедитесь, что вы применяете его как во время запроса, так и во время индекса.

Тем не менее, вы уверены, что вам это нужно? Поскольку positionIncrements должны применяться одинаковыми способами во время запроса и индекса, их наличие, как правило, будет полезно. Вы видите особые проблемы при запросе индекса? Или просто видите странные вещи в выводе отладки?

person femtoRgon    schedule 19.09.2013
comment
Спасибо большое. Я попробую это. Я ненавижу терять позиционные метаданные, так как они могут восстановиться как требование в будущем. На данный момент все мои фасетные ограничения выглядят неинформативно с этими символами подчеркивания. - person phanin; 19.09.2013

В выпуске Solr 4.7 у вас есть возможность переопределить токен-заполнитель по умолчанию "_". Вы можете установить его на пустое место. Конфигурация будет такой:

<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true" fillerToken=""/>
person Steve    schedule 22.05.2014
comment
проблема в том, что вы все равно будете получать ngrams для токенов-заполнителей, просто используемая строка будет пустой, поэтому для слова a word, учитывая, что у вас есть фильтр длины с min 3, вы получите две диграммы: слово и слово дальше. - person Yeti; 18.08.2015
comment
Хуже того, дубликаты (как сообщает Yeti) не могут быть удалены с помощью файла RemoveDuplicatesTokenFilterFactory. - person Jack Miller; 26.09.2017