Быстрый вопрос, я не знаю, как иметь дело с синонимами, которые содержат пространство! У меня есть следующая конфигурация:
Файл конфигурации SOLR
<fieldType ... >
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory"
catenateWords="1"
preserveOriginal="1"
splitOnCaseChange="1"
generateWordParts="1"
generateNumberParts="1"
catenateNumbers="1"
catenateAll="1"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30" side="front"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LengthFilterFactory" min="2" max="70" />
<filter class="solr.SynonymFilterFactory" synonyms="syn.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Мой файл: syn.txt
st., st => saint
istambul => istanbul
airport, apt => aéroport
NYC => New York
pt., pt => port
brussels => bruxelles
Все работало отлично, за исключением синонима:
"NYC => New York"
Я провел некоторое исследование, и я нашел следующее:
Имейте в виду, что, хотя SynonymFilter будет с удовольствием работать с синонимами, содержащими несколько слов (например: "морское печенье, морское бисцит, морское печенье" )
Рекомендуемым подходом к синонимам, подобным этому, является расширение синонима при индексировании. Это связано с тем, что есть две потенциальные проблемы, которые могут быть достигнуты во время запроса:
Lucene QueryParser выполняет токенизацию на белом фоне перед тем, как передать какой-либо текст анализу, поэтому, если человек ищет слова "морской бисквит", анализатору будут даны слова "море" и "бисцит" отдельно, и они не будут знать, что они соответствуют синониму.
Поиск фразы (т.е. "морской бисквит" ) заставит QueryParser передать всю строку в анализатор, но если SynonymFilter настроен на расширение синонимов, тогда, когда QueryParser получает результирующий список токенов назад Analyzer, он построит MultiPhraseQuery, который не будет иметь желаемого эффекта.
Это связано с ограниченным механизмом, доступным для анализатора, чтобы указать, что два члена занимают одно и то же положение: нет способа указать, что "фраза" занимает ту же позицию, что и термин.
В нашем примере полученный MultiPhraseQuery будет "(море | море | морское печенье) (biscuit | biscit)", которое не соответствовало бы простому случаю "морского печенья", имеющему место в документе
Итак, я попытался изменить свой файл конфигурации и добавить свои фильтры при индексировании, но он не работает.
Есть ли у чего-то идеи?