Zapytanie o dopasowaniu ścisłym Elasticsearch (nierozmyte)
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
W twoim przypadku wszystkie dokumenty wracają, ponieważ wszystkie dokumenty ron
w nich są.
Jeśli chcesz, aby tylko dokładne pole było zgodne, musisz dodać keyword
podpole do name
pola. 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"
}
}
]