Comparação de analisadores Lucene

104

Alguém pode explicar a diferença entre os diferentes analisadores no Lucene? Estou recebendo uma exceção maxClauseCount e entendo que posso evitar isso usando um KeywordAnalyzer, mas não quero mudar do StandardAnalyzer sem entender os problemas que envolvem os analisadores. Muito obrigado.

Journeyman
fonte

Respostas:

209

Em geral, qualquer analisador no Lucene é tokenizer + lematizador + filtro de palavras de interrupção.

O tokenizer divide seu texto em pedaços e, como diferentes analisadores podem usar diferentes tokenizadores, você pode obter diferentes fluxos de tokens de saída , ou seja, sequências de pedaços de texto. Por exemplo, KeywordAnalyzervocê mencionou que não divide o texto e considera todos os campos como um único token. Ao mesmo tempo, StandardAnalyzer(e a maioria dos outros analisadores) usam espaços e pontuação como pontos de divisão. Por exemplo, para a frase "Estou muito feliz", ela produzirá uma lista ["eu", "sou", "muito", "feliz"] (ou algo parecido). Para obter mais informações sobre analisadores / tokenizadores específicos, consulte seus Java Docs .

Os lematizadores são usados ​​para obter a base de uma palavra em questão. Depende muito da linguagem usada. Por exemplo, para a frase anterior em inglês haverá algo como ["i", "be", "veri", "happi"] produzido, e para o francês "Je suis très heureux" algum tipo de analisador francês (como SnowballAnalyzer, inicializado com "francês") produzirá ["je", "être", "tre", "heur"]. Obviamente, se você usar o analisador de um idioma para derivar o texto em outro, as regras do outro idioma serão usadas e o lematizador pode produzir resultados incorretos. Não é falha de todo o sistema, mas os resultados da pesquisa podem ser menos precisos.

KeywordAnalyzernão usa lematizadores, passa todo o campo sem modificações. Portanto, se você for pesquisar algumas palavras em um texto em inglês, não é uma boa ideia usar este analisador.

Palavras irrelevantes são as palavras mais frequentes e quase inúteis. Novamente, isso depende muito do idioma. Para o inglês, essas palavras são "a", "the", "I", "be", "have", etc. Filtros de palavras irrelevantes as removem do fluxo de tokens para reduzir o ruído nos resultados da pesquisa, então finalmente nossa frase "I estou muito feliz "com StandardAnalyzerserá transformado em lista [" veri "," happi "].

E KeywordAnalyzernovamente não faz nada. Portanto, KeywordAnalyzeré usado para coisas como ID ou números de telefone, mas não para texto normal.

E quanto à sua maxClauseCountexceção, acredito que você o entende na busca. Neste caso, provavelmente é devido a uma consulta de pesquisa muito complexa. Tente dividi-lo em várias consultas ou use funções de nível mais baixo.

amiga
fonte
1
@ amigo: eu não acho que Stemmer (usando bola de neve ou outros algoritmos) pode converter am -> ser porque é um trabalho do Lemmatizer. Você pode conferir aqui snowball.tartarus.org/demo.php
Tho
Então, onde Tika se encaixa nisso? Não é tecnicamente um analisador?
Anon
1
@anon: Tika é um projeto separado com vários recursos principais. Supondo que você se refira aos analisadores Tika, eu diria que o Tika pega fluxo de bytes e produz texto + metadados, enquanto os analisadores Lucene pegam texto e produzem fluxo de token processado. Por exemplo, você pode primeiro analisar o arquivo PDF ou XML com Tika, produzindo documentos com campos como "título", "autor" e "texto" e, em seguida, analisar alguns ou todos esses campos com analisadores Lucene.
namorada
apenas pensando, "muito" e "feliz" não são palavras recusadas, por que são transformadas em "veri" e "happi"? é para combinar i <-> y diferenças, uma vez que soam semelhantes?
oguzalb
0

Na minha perspectiva, usei StandAnalyzere SmartCNAnalyzer. Como tenho que pesquisar texto em chinês. Obviamente, SmartCnAnalyzeré melhor lidar com chineses. Para diferentes propósitos, você deve escolher o analisador mais adequado.

neal
fonte