Eu tenho um arquivo com nomes de artistas. Estou tentando pesquisar na API REST do Art Institute of Chicago em busca de obras desses artistas. Um dos nomes no arquivo era 'Romare Beardon'. Minha consulta do Elasticsearch não encontrou nada.
criteria = {
"query": {"match_phrase" : {"artist_title": "romare beardon"}}
}
O problema é que o arquivo escreveu incorretamente o sobrenome (s/b 'Bearden') e o Instituto lista o nome do artista como 'Romare Howard Bearden'.
Portanto, minha consulta precisa perdoar pequenos erros ortográficos e levar em conta nomes do meio.
Eu experimentei com desleixo"
criteria = {
"query" : {"match_phrase": {"artist_title": {"query":"Romare Bearden", "slop":1 }}},
}
Isto encontra corretamente Romare Howard Bearden!
E eu experimentei imprecisão:
criteria = {
"query": {
"fuzzy" : {"artist_title": {"value": "Beardon", "fuzziness": "AUTO"}}},
}
Isto encontra 'Bearden', mas também encontra 'Pearson'. Não aceitável.
Alterar AUTO para 1 não retorna nada. Alterar AUTO para 2 retorna 'Bearden' e 'Pearson'. Não aceitável.
Alguém pode me ajudar a escrever uma consulta que possa pegar 'Romare Beardon' e encontrar 'Romare Howard Bearden'. Ele precisa ser generalizado para que qualquer nome e sobrenome, mesmo que ligeiramente incorreto, encontre o primeiro meio e o último com alta precisão.
Posso pensar em uma solução possível onde você pode dividir
artist_title
o texto em palavras e depois aplicar imprecisão no texto de pesquisa como:O seguinte analisador de espaços em branco pode ser especificado ao criar o mapeamento para o índice elástico:
Como mencionado acima, os artist_title presentes em elastic são
Romare Howard Bearden
ePearson
.Para um texto de pesquisa:
Romar Beardon
, a consulta de pesquisa com imprecisão seria:Isso daria o resultado pretendido
Romare Howard Bearden
com texto desleixado e combinação de nome e sobrenome.Explicação:
Durante a criação do mapeamento, o analisador de espaços em branco quebraria o texto e os indexaria separadamente, o que mais tarde, quando consultado separadamente como texto difuso, produziria o resultado. No entanto, o texto de pesquisa precisa ser dividido e adicionado separadamente como consulta difusa. O
fuzziness
valor pode ser alterado de AUTO para qualquer número inteiro para especificar o número de imprecisão a ser aplicado.Para
AUTO
, de acordo com Documentos :Alternativamente, se
"fuzziness": "2"
, o número máximo de caracteres difusos permitidos é 2 para produzir um resultado de pesquisa. Por exemplo,Roma
também produziria o resultado da pesquisa com 2 caracteresr
ee
está faltando.Espero que isto ajude.