У нас есть база данных фильмов и сериалов, и поскольку данные поступают из многих источников различной надежности, мы хотели бы иметь возможность выполнять нечеткое сопоставление строк в названиях эпизодов. Мы используем Solr для поиска в нашем приложении, но механизмы сопоставления по умолчанию работают на уровне слов, что недостаточно для коротких строк, таких как заголовки
В прошлом я использовал приблизительное сопоставление по n-граммам, и я был очень рад обнаружить, что Lucene (и Solr) поддерживают что-то подобное из коробки. К сожалению, я не смог правильно его настроить.
Я предположил, что мне нужен специальный тип поля для этого, поэтому я добавил
следующий тип поля для моего schema.xml:
<fieldType
name="trigrams"
stored="true"
class="solr.StrField">
<analyzer type="index">
<tokenizer
class="solr.analysis.NGramTokenizerFactory"
minGramSize="3"
maxGramSize="5"
/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
и изменил соответствующее поле в схеме на:
<field name="title" type="trigrams"
indexed="true" stored="true" multiValued="false" />
Однако это не работает, как я ожидал. Анализ запросов выглядит
правильно, но я не получаю никаких результатов, что заставляет меня верить, что
что-то происходит во время индексации (т. е. заголовок индексируется как
строковое поле по умолчанию вместо поля триграммы).
запрос, который я пытаюсь сделать, похож на
title:"guy walks into a psychiatrist office"
(с опечаткой или двумя), и оно должно совпадать с "Парень заходит в кабинет психиатра".
(Я не совсем уверен, что запрос правильный.)
Более того, я хотел бы иметь возможность сделать что-то большее на самом деле. Я бы хотел
опустите строку, удалите все знаки препинания и пробелы, удалите
Английские стоп-слова и ТО затем изменяют строку на триграммы. Тем не мение,
фильтры применяются только после токенизации строки ...
Заранее спасибо за ваши ответы.