Elasticsearch-Abfrage für exakte Übereinstimmungen (nicht unscharf)
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
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 keyword
dem name
Feld 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"
}
}
]