Consulta de correspondência exata do Elasticsearch (não difusa)
Tenho a seguinte consulta sobre um campo de string:
const query = {
"query": {
"match_phrase": {
name: "ron"
}
},
"from": 0,
"size": 10
};
estes são os nomes que tenho no banco de dados
1. "ron"
2. "ron martin"
3. "ron ron"
4. "ron howard"
o resultado desta consulta é muito difuso, todas as linhas são retornadas em vez da linha número 1 apenas. É como se estivesse executando "contém" em vez de "igual".
obrigado
Respostas
No seu caso, todos os documentos estão voltando, porque todos os documentos estão ron
neles.
Se você deseja que apenas o campo exato corresponda, você precisa adicionar um keyword
subcampo ao name
campo. Este usa o analisador de palavras-chave em vez do analisador padrão (observe o campo ".keyword
"depois name
). Experimente esta consulta abaixo -
Mapeamento de índice:
{
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
Dados do índice:
{
"name":"ron"
}
{
"name":"ron martin"
}
{
"name":"ron ron"
}
{
"name":"ron howard"
}
{
"name": "john howard"
}
Consulta de pesquisa:
{
"query": {
"match_phrase": {
"name.keyword": "ron"
}
},
"from": 0,
"size": 10
}
Resultado da pesquisa:
"hits": [
{
"_index": "64982377",
"_type": "_doc",
"_id": "1",
"_score": 1.2039728,
"_source": {
"name": "ron"
}
}
]
Atualização 1:
Com base nos comentários abaixo, se você deseja pesquisar por correspondência exata e fuzzy (de acordo com sua necessidade), então você pode usar a consulta multi_match .
Consulta de pesquisa:
{
"query": {
"multi_match": {
"query": "howard",
"fields": [
"name",
"name.keyword"
],
"type": "phrase"
}
}
}
Resultado da pesquisa:
"hits": [
{
"_index": "64982377",
"_type": "_doc",
"_id": "4",
"_score": 0.83740485,
"_source": {
"name": "ron howard"
}
},
{
"_index": "64982377",
"_type": "_doc",
"_id": "5",
"_score": 0.83740485,
"_source": {
"name": "john howard"
}
}
]