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.

questionAnswers(2)

yourAnswerToTheQuestion