Como usar a correspondência aproximada de n-gramas com Solr?
Temos um banco de dados de filmes e séries e, como os dados vêm de muitas fontes de confiabilidade variada, gostaríamos de poder fazer correspondência de strings difusas nos títulos dos episódios. Estamos usando o Solr para pesquisa em nosso aplicativo, mas os mecanismos de correspondência padrão operam em níveis de palavra, o que não é bom o suficiente para strings curtas, como títulos
Eu tinha usado correspondência aproximada de n-gramas no passado, e fiquei muito feliz em descobrir que Lucene (e Solr) apóia algo assim fora da caixa. Infelizmente, não consegui configurá-lo corretamente.
Presumi que eu precisava de um tipo de campo especial para isso, então adicionei o seguinte tipo de campo ao meu 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>
e alterou o campo apropriado no esquema para:
<field name="title" type="trigrams"
indexed="true" stored="true" multiValued="false" />
No entanto, isso não está funcionando como eu esperava. A análise da consulta parece correta, mas não obtenho nenhum resultado, o que me faz acreditar que algo acontece no tempo do índice (ou seja, o título é indexado como um campo de string padrão em vez de um campo trigrama).
A consulta que estou tentando é algo como
title:"guy walks into a psychiatrist office"
(com um erro de digitação ou dois) e deve corresponder "Guy Walks em um escritório de psiquiatra".
(Não tenho certeza se a consulta está correta.)
Além disso, gostaria de poder fazer algo mais de fato. Eu gostaria de diminuir o tamanho da string, remover todos os sinais de pontuação e espaços, remover palavras inglesas e depois mudar a string para os trigramas. No entanto, os filtros são aplicados somente após a string ter sido tokenizada ...
Agradecemos antecipadamente por suas respostas.