Consulta de correspondência exata do Elasticsearch (não difusa)

Nov 24 2020

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

1 ESCoder Nov 24 2020 at 15:08

No seu caso, todos os documentos estão voltando, porque todos os documentos estão ronneles.

Se você deseja que apenas o campo exato corresponda, você precisa adicionar um keywordsubcampo ao namecampo. 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"
        }
      }
    ]