Zapytanie o dopasowaniu ścisłym Elasticsearch (nierozmyte)

Nov 24 2020

Mam następujące zapytanie w polu ciągu:

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

to są nazwiska, które mam w bazie danych

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

wynik tego zapytania jest bardzo rozmyty, zwracane są wszystkie wiersze zamiast tylko wiersza numer 1. To tak, jakby wykonywał „zawiera” zamiast „równa się”.

Dzięki

Odpowiedzi

1 ESCoder Nov 24 2020 at 15:08

W twoim przypadku wszystkie dokumenty wracają, ponieważ wszystkie dokumenty ronw nich są.

Jeśli chcesz, aby tylko dokładne pole było zgodne, musisz dodać keywordpodpole do namepola. Używa analizatora słów kluczowych zamiast standardowego analizatora (zwróć uwagę na pole ".keyword„po” name). Wypróbuj poniższe zapytanie -

Mapowanie indeksu:

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

Dane indeksowe:

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

Wyszukiwana fraza:

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

Wynik wyszukiwania:

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

Aktualizacja 1:

Na podstawie poniższych komentarzy, jeśli chcesz wyszukać zarówno dopasowanie ścisłe, jak i rozmyte (zgodnie z wymaganiami), możesz użyć zapytania multi_match .

Wyszukiwana fraza:

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

Wynik wyszukiwania:

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