2011-12-20 12 views
10

W MySQL można zrobić coś takiego:Elastic Search Limit

SELECT id FROM table WHERE field = 'foo' LIMIT 5 

Jeśli tabela zawiera 10.000 wierszy, to zapytanie jest sposób sposób szybciej niż gdybym pominął część limitu.

W ElasticSearch, mam następujące:

{ 
    "query":{ 
     "fuzzy_like_this_field":{ 
      "body":{ 
      "like_text":"REALLY LONG (snip) TEXT HERE", 
      "max_query_terms":1, 
      "min_similarity":0.95, 
      "ignore_tf":true 
      } 
     } 
    } 
} 

Kiedy uruchomić to wyszukiwanie, to trwa kilka sekund, natomiast mysql może zwrócić wyników dla tego samego zapytania w znacznie, znacznie mniej czasu.

Jeśli przekażę parametr wielkości (ustawiony na 1), to z powodzeniem zwraca tylko wynik 1, ale samo zapytanie nie jest szybsze, niż gdybym ustawił rozmiar nieograniczony i zwrócił wszystkie wyniki. Podejrzeń, że kwerenda jest uruchamiana w całości i tylko jeden wynik jest zwracany po zakończeniu przetwarzania kwerendy. Oznacza to, że atrybut "rozmiar" jest bezużyteczny dla moich celów.

Czy istnieje sposób, aby moje wyszukiwanie zakończyło wyszukiwanie, gdy tylko znajdzie pojedynczy rekord pasujący do wyszukiwania rozmytego, a nie przetwarza każdy rekord w indeksie przed zwróceniem odpowiedzi? Czy nie rozumiem czegoś bardziej fundamentalnego na ten temat?

Z góry dziękuję.

Odpowiedz

9

Twoje zapytanie jest całkowicie uruchomione. Domyślnie zapytania zwracają dane posortowane według wyniku, więc w zapytaniu zostanie zapisany każdy dokument. Dokumenty mówią, że fuzzy query nie będzie dobrze skalowany, więc może rozważyć inne zapytania.

A limit filter może dać ci podobne zachowanie do tego, czego szukasz.

Filtr limitu ogranicza liczbę dokumentów (za odłamek) na wykonanie na

Aby replikować mysql field='foo' spróbuj użyć term filter. Powinieneś używać filtrów, gdy nie zależy Ci na punktowaniu, są one szybsze i mogą być buforowane.

Powiązane problemy