2013-03-07 1 views
0

1. Что я делаю:SOLR SynonymFilter и WordDelimiter проблема

Я в настоящее время пытаюсь реализовать некоторые популярные синонимы, чтобы увеличить количество отображаемых объявлений.


2. Ограничения:

Благодаря бизнес-логики, мой оператор по умолчанию и так, как я понимаю, ищу:

"PS3 Slim 250gb новый"

Должны возвращать элементы, содержащие каждый отдельный термин в этом запросе. Я попытался переключиться на «OR», но это вернет элементы только с надписью «new» или «slim».

Поскольку мы всегда сортируем по дате, а не по релевантности, это огромная проблема. Итак, «И».

Идея состоит в том, чтобы иметь дело с множеством синонимов и стоп-слов.


3. Мои настройки:

Моя текущая настройка SOLR содержит следующую цепочку: анализатор

<fieldtype name="text_pt" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.ASCIIFoldingFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" 
      generateNumberParts="1" preserveOriginal="1" catenateWords="1" 
      catenateNumbers="1" catenateAll="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="false" words="portugueseStopWords.txt"/> 
     <filter class="solr.BrazilianStemFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.ASCIIFoldingFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.SynonymFilterFactory" ignoreCase="true" synonyms="portugueseSynonyms.txt" 
       expand="true"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="portugueseStopWords.txt"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" 
       catenateWords="1" preserveOriginal="1" catenateNumbers="1" catenateAll="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.BrazilianStemFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldtype> 



4. Проблема:

У меня есть синонимы:

plaistation, plastation => playstation #dirty spelling correction 
ps3, playstation3 #just a synonym 

Первый только что работает. Второй результат в то, что, как представляется, конфликт между синонима и WordDelimiter, как видно на обеих странице анализ и & debugQuery:

Debug Query

<str name="querystring">title_search_pt:(ps3)</str> 
<str name="parsedquery">MultiPhraseQuery(title_search_pt:"(ps3 ps) (3 playstation3 playstation) 3")</str> 

Анализатор запросов

WhitespaceTokenizerFactory => [pos:1] ps3 
ASCIIFoldingFilterFactory => [pos:1] ps3 
SynonymFilterFactory  => [pos:1] ps3 
           [pos:1] playstation3 

StopFilterFactory   => [pos:1] ps3 
           [pos:1] playstation3 

WordDelimiterFilterFactory => [pos:1] ps3 [pos:2] 3    [pos:3] 3 
           [pos:1] ps [pos:2] playstation3 
              [pos:2] playstation 


Как вы можете видеть, все было хорошо, пока WordDelimiterFilter не испортил это.
То, что я ожидал, было ps и playstation как в pos: 1, так и 3 в pos: 2.
Это не проблема, если у меня была операция «ИЛИ» как операция по умолчанию, но поскольку это невозможно для меня, это будет пытаться сопоставить документы, имеющие BOTH ps3 и playstation3, которые вместо того, чтобы давать мне больше результатов, это дает меня даже меньше ..


5.Вопрос:

Что я могу сделать по этому поводу? Я думаю, что WordDelimiterFilter дает много хороших вещей, чтобы полностью удалить его, но это смещение позиции маркера не выглядит правильным для меня.

+0

'увеличить количество отображаемых объявлений' hmmm ... не уверен, помогать или ... –

ответ

1

Я решил его, используя неприятный способ добавления синонимов, эксплуатируя «ограничение» из фразы синонимов, как это:

ps3 => playstation 3, ps 3 
ps2 => playstation 2, ps 2 

Это своего рода хака использования как замены (в =>) и синоним (два слова разделяются запятой).

Query Analyzer выглядит следующим образом:

WhitespaceTokenizerFactory => [pos:1] ps3 
ASCIIFoldingFilterFactory => [pos:1] ps3 
SynonymFilterFactory  => [pos:1] ps   [pos:2] 3 
           [pos:1] playstation [pos:2] 3 

StopFilterFactory   => [pos:1] ps   [pos:2] 3 
           [pos:1] playstation [pos:2] 3 

WordDelimiterFilterFactory => [pos:1] ps   [pos:2] 3 
           [pos:1] playstation [pos:2] 3 
... 
RemoveDuplicatesTokenFilterFactory => [pos:1] ps   [pos:2] 3 
             [pos:1] playstation 

И debugQuery:

<str name="querystring">title_search_pt:(ps3 new)</str> 
<str name="parsedquery">+MultiPhraseQuery(title_search_pt:"(playstation ps) 3") +title_search_pt:new</str> 

Я мог бы отказаться от одного из 3-х из синонимов, потому что оба 3-х будет в конечном итоге на то же самое положение маркера и будет удалено с помощью RemoveDuplicatesTokenFilterFactory. Однако я сохранил это так, поэтому мой файл синонимов менее загадочен.

0

Вы можете установить атрибут splitOnNumerics="0" для WordDelimiterFilterFactory

splitOnNumerics = "1" вызывает алфавит => количество переходов для создания новой части

"j2se" => "J" " 2 "" se "

Значение по умолчанию истинно (" 1 "); установить на 0, чтобы отключить

Это должно устранить проблему его разделения ps3 и playstation3 на два токена, одно со словом и одно с числовым значением.

+0

Да, но это не соответствует поисковым запросам, таким как «playstation 3» или «iphone4», или «nvidia 550ti», –

0

Чтобы завершить свой ответ:

вы можете добавить все слова, которые вы положили в синонимов (или только он один, который даст вам проблемы) и в файле protwords.txt так, что все tokenizers будет игнорировать их и просто индексируйте их так, как они есть.

Это имеет смысл, если используется в сочетании с синонимом как синоним - это слово, которое вы хотите найти как есть.

Смежные вопросы