Как использовать n-граммы приблизительного соответствия с Solr? - PullRequest
9 голосов
/ 21 августа 2009

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

(с опечаткой или двумя), и оно должно совпадать с "Парень заходит в кабинет психиатра".

(Я не совсем уверен, что запрос правильный.)

Более того, я хотел бы иметь возможность сделать что-то большее на самом деле. Я бы хотел опустите строку, удалите все знаки препинания и пробелы, удалите Английские стоп-слова и ТО затем изменяют строку на триграммы. Тем не мение, фильтры применяются только после токенизации строки ...

Заранее спасибо за ваши ответы.

Ответы [ 2 ]

9 голосов
/ 23 августа 2009

Чтобы ответить на последнюю часть вашего вопроса: у solr также есть фильтр ngram. Поэтому вам не следует использовать токенайзер ngram (но, например, такой как «WhitespaceTokenizer»), применять все фильтры перед ngram, а затем добавить этот:

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />
3 голосов
/ 22 августа 2009

Решение оказалось очень простым: в качестве оператора по умолчанию было задано AND, и если какой-либо из ngram не совпадал, весь запрос не удался. Итак, достаточно было добавить:

<solrQueryParser defaultOperator="OR" />

в моем определении схемы.

...