Elasticsearch-Abfrage für exakte Übereinstimmungen (nicht unscharf)

Nov 24 2020

Ich habe die folgende Abfrage über ein Zeichenfolgenfeld:

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

Dies sind die Namen, die ich in der Datenbank habe

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

Das Ergebnis dieser Abfrage ist sehr unscharf. Alle Zeilen werden anstelle der Zeilennummer 1 zurückgegeben. Es ist, als würde es "enthält" statt "gleich" ausführen.

Vielen Dank

Antworten

1 ESCoder Nov 24 2020 at 15:08

In Ihrem Fall werden alle Dokumente zurückgegeben, da alle Dokumente darin enthalten sind ron.

Wenn Sie möchten, dass nur das genaue Feld übereinstimmt, müssen Sie keyworddem nameFeld ein Unterfeld hinzufügen . Dies verwendet den Schlüsselwortanalysator anstelle des Standardanalysators (beachten Sie das Feld ".keyword" Nachher " name). Probieren Sie die folgende Abfrage aus -

Indexzuordnung:

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

Indexdaten:

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

Suchanfrage:

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

Suchergebnis:

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

Update 1:

Basierend auf den Kommentaren unten können Sie die multi_match-Abfrage verwenden , wenn Sie sowohl nach der genauen Übereinstimmung als auch nach der Fuzzy-Übereinstimmung suchen möchten (je nach Ihren Anforderungen) .

Suchanfrage:

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

Suchergebnis:

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