Requête de correspondance exacte Elasticsearch (non floue)

Nov 24 2020

J'ai la requête suivante sur un champ de chaîne:

const query = {
        "query": {
          "match_phrase": {
            name:  "ron"
          }
        },
        "from": 0,
        "size": 10
      };

ce sont les noms que j'ai dans la base de données

1. "ron"
2. "ron martin"
3. "ron ron"
4. "ron howard"

le résultat de cette requête est très flou, toutes les lignes sont renvoyées au lieu de la ligne numéro 1 uniquement. C'est comme s'il exécutait "contient" au lieu de "égal".

Merci

Réponses

1 ESCoder Nov 24 2020 at 15:08

Dans votre cas, tous les documents sont de retour, car tous les documents les contiennent ron.

Si vous voulez que seul le champ exact corresponde, vous devez ajouter un keywordsous- namechamp au champ. Cela utilise l'analyseur de mots clés au lieu de l'analyseur standard (notez le champ ".keyword"après name). Essayez cette requête ci-dessous -

Mappage d'index:

{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

Données d'index:

{
    "name":"ron"
}
{
    "name":"ron martin"
}
{
    "name":"ron ron"
}
{
    "name":"ron howard"
}
{
    "name": "john howard"
}

Requête de recherche:

{
  "query": {
    "match_phrase": {
      "name.keyword": "ron"
    }
  },
  "from": 0,
  "size": 10
}

Résultat de la recherche:

"hits": [
      {
        "_index": "64982377",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.2039728,
        "_source": {
          "name": "ron"
        }
      }
    ]

Mise à jour 1:

Sur la base des commentaires ci-dessous, si vous souhaitez rechercher à la fois une correspondance exacte et une correspondance approximative (selon vos besoins), vous pouvez utiliser la requête multi_match .

Requête de recherche:

{
  "query": {
    "multi_match": {
      "query": "howard",
      "fields": [
        "name",
        "name.keyword"
      ],
      "type": "phrase"
    }
  }
}

Résultat de la recherche:

"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"
        }
      }
    ]