"защищенная фраза" в Solr - PullRequest
       23

"защищенная фраза" в Solr

3 голосов
/ 19 февраля 2011

Мой клиент - это фотоагентство, специализирующееся на фотожурналистике (ну, и сплетнях), поэтому многие поиски их клиентов связаны с конкретными людьми.

Мы индексируем около 1,5 млн документов с полным текстомпоиск по заголовку и подписи;и полнотекстовый поиск без использования тегов.У нас есть приличный список стоп-слов, и они предоставляют список защищенных слов, которые, по их мнению, не соответствуют действительности.Мы используем Dismax для поиска по заголовкам, заголовкам и тэгам, с разными надбавками) Все это работает очень хорошо.

Однако некоторые люди оказываются хитрыми, чтобы получить права.Например, Эл Гор.В итальянском языке «al» - это стоп-слово, поэтому простой запрос для «al gore» (без кавычек) становится следующим:

+((DisjunctionMaxQuery((caption_text:gor | tags_text:gore^100.0 | headline_text:gor)))~1) ()

Это возвращает хиты для бывшего вице-президента, но, конечно же, и для «Lesley».Гора "и" Самосвал Гора ";а также, из-за stemming, хиты для "Гори" и многое другое.Оставляя в стороне сортировку на секунду, она загромождает результаты, и я хотел бы добиться большего.

Заключение поисковых терминов в кавычки не помогает, "al" в любом случае удаляется.Обозначение «Гора» как защищенного слова ведет меня на полпути, ограничивая количество ложных срабатываний.Я тоже пытался поиграть с SynonymFilterFactory, но не зашел слишком далеко - у меня SynonymFilterFactory в качестве первого фильтра, поэтому в любом случае удаляется «al».

Что мне действительно нужно, так это способ токенизации"al gore" как один жетон.Что-нибудь, что позволит мне сделать это для набора настраиваемых «фраз»?Есть ли другой подход, который я пропускаю?Возможно, solr.CommonGramsFilterFactory?

Дополнительная информация: мы используем Solr 1.4.0.Соответствующие части schema.xml

<!-- used for headline and caption -->
<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="Italian" protected="protwords.txt"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SnowballPorterFilterFactory" language="Italian" protected="protwords.txt"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>

<fieldType name="tagsText" class="solr.TextField" sortMissingLast="true" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>   
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.it.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>  
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>

1 Ответ

1 голос
/ 23 февраля 2011

Вы смотрели в CommonGramsFilterFactory Это будет:

  • объединить несколько токенов в один лексема
  • обычно используется при поиске фразы, содержащей стоп-слова
...