Parâmetros SnowballPorterFilterFactory e Wildcard do Solr
-
28-09-2020 - |
Pergunta
Estou tendo problemas ao consultar o Solr usando o seguinte tipo de campo:
<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
</analyzer>
</fieldType>
Como você pode ver, ele aplica o "SnowballPorterFilterFactory" ao indexar e consultar.Se eu indexar algo como
Coisas de mouse e diversão
Ele é indexado como:
Como você pode ver a palavra "Mouse" foi transformada em "Mous" pelo "SnowballPorterFilterFactory".É isso que queremos.Porém quando procuramos
Rato*
Parece não aplicar o "SnowballPorterFilterFactory" da mesma maneira.Acho que devido ao * no final.
Minha pergunta é..Existe uma maneira de fazer com que o "SnowballPorterFilterFactory" conheça os curingas?Então, quando eu consultar
Rato*
Não obtenho 0 resultados.
Curiosamente, se eu consultar
rato*
O disco volta.
Ou alguém pode oferecer uma maneira melhor de consultar/indexar esse tipo de campo?
Obrigado Dave
Solução
Ao contrário de outros tipos de consultas Lucene, as consultas Wildcard, Prefix e Fuzzy não são passadas pelo Analisador, que é o componente que executa operações como lematização e letras minúsculas.A razão para pular o Analisador é que se você estivesse procurando por "cachorros*", você não iria querer que "cachorros" fosse primeiro derivado de "cachorro", pois isso corresponderia a "cachorro*", que não é a consulta pretendida.De qualquer forma, essas consultas não diferenciam maiúsculas de minúsculas porque QueryParser as torna minúsculas.Este comportamento pode ser alterado usando o método setLowercaseExpandedTerms(boolean)
Se você concordar em alterar sua fonte Solr, SOLR-757 tem um patch anexado que pode ser útil.Não conheço outra maneira de mudar isso a não ser mergulhar na fonte.
O que pode ser uma ideia mais simples:basta ter um campo de cópia que não tenha origem.O usuário pode pesquisar esses dois campos e, em seguida, mouse* corresponderá ao campo sem radical.
(EDITAR:na verdade, olhando para esse patch, não tenho certeza se ele fará o que você deseja.Mas basicamente você só precisa alterar seu manipulador de consulta para originar primeiro.)
Outras dicas
Da última vez que verifiquei, quando você usa curingas, o analisador de consulta não é usado.Portanto, como você está usando um LowerCaseFilterFactory, seus termos são indexados em letras minúsculas e a pesquisa por Mous* não retornará nada.
Acho que a única coisa a fazer quando você usa curingas é adaptar sua consulta à forma como seus termos são indexados (de maneira semelhante ao que seu analisador de consulta faria).