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