2015-08-03 15 views
9

W wielu miejscach dokumentacji gramatycznej zapytań elasticsearch dsl, pakowalne zapytania json są pomijane w wyjaśnieniach prawdopodobnie w celu zmniejszenia rozmiaru dokumentacji. Ale było to mylące, ponieważ przeglądałem dokumentację. Jakie są oficjalne zasady dotyczące tego, co może lub powinno iść w przypadku zapytania json?Innymi słowy, próbuję znaleźć standard lub wzorzec powszechny we wszystkich zapytaniach elastycznych, ponieważ muszę zbudować wewnętrzny interfejs API, aby elastycznie wyszukiwać zapytania. Czy istnieje szablon, który zawiera wszystkie składniki gramatyki "query': {} wewnątrz "bool":{} lub filter itp., W których mogę po prostu wypełnić odpowiednie części i nadal działa?Confusions dotyczące struktury zapytania Json dsl zapytania Elasticsearch

Odpowiedz

6

Również struktura DSL Elastic jest myląca, ale po uruchomieniu setek zapytań można się do tego przyzwyczaić.

Oto kilka (pełnych) przykładów różnych typów zapytań, mam nadzieję, że pomoże to w rozwiązaniu niektórych pytań, możesz dodać scenariusze do komentarza, a ja dodam więcej przykładów.

ten sposób standardowy kwerenda wygląda następująco:

{ 
    "query": { 
     "bool": { 
      "must": { 
       "match": { 
        "message": "abcd" 
       } 
      } 
     } 
    } 
} 

jednak jest to, w jaki sposób filtrowane zapytania wygląda, można zauważyć zmianę w strukturze podczas filtrowania elasticsearch:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "term": { 
        "message": "abcd" 
       } 
      } 
     } 
    } 
} 

(Read more about the difference between Filters and Queries)

Oto jak wygląda zapytanie z filtrami i zapytaniami:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "term": { 
        "message": "abcd" 
       } 
      }, 
      "query": { 
       "bool": { 
        "must": { 
         "match": { 
          "message2": "bbbb" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Oto jak uruchomić filtr z wielu warunków:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "and": [ 
        { 
         "term": { 
          "message": "abcd" 
         } 
        }, 
        { 
         "term": { 
          "message2": "abcdd" 
         } 
        } 
       ] 
      } 
     } 
    } 
} 

i bardziej złożony filtr:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "and": [ 
        { 
         "term": { 
          "message": "abcd" 
         } 
        }, 
        { 
         "term": { 
          "message2": "abcdd" 
         } 
        }, 
        { 
         "or": [ 
          { 
           "term": { 
            "message3": "abcddx" 
           } 
          }, 
          { 
           "term": { 
            "message4": "abcdd2" 
           } 
          } 
         ] 
        } 
       ] 
      } 
     } 
    } 
} 

proste zapytanie ze skupiskami:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "term": { 
        "message": "abcd" 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "any_name_will_work_here": { 
      "max": { 
       "field": "metric1" 
      } 
     } 
    } 
} 

query_string zapytania :

{ 
    "query": { 
     "query_string": { 
      "default_field": "message", 
      "query": "this AND that" 
     } 
    } 
} 

Kilka innych rzeczy do rozważenia przy użyciu DSL:

  1. Możesz dodać parametr size na najwyższym poziomie (powyżej zapytania), który określi ilość zwracanych wyników. Jeśli chcesz JUST doc counts możesz użyć "size": 0, który nie dostanie żadnych wyników, tylko meta dane.
  2. Jednak podczas korzystania aggs parametr rozmiar ma skręt, ustawienie "size": 0 wewnątrz pola aggs powie ES dostać Wszystkie łyżki agregacji
  3. Struktura DSL ma wyjątki, w moich przykładów zwykle używany terms, ale range na przykład ma nieco inną strukturę.
+0

Dziękuję. Więc w Filtersach nie możesz mieć musts, shoulds i must_nots? Możesz mieć tylko AND AND OR etc?W takim przypadku mam 2 pytania. Jaka jest różnica między AND w Filters i Bools (Must, should etc.) w zapytaniach? Co z zapytaniem query_string? Czy to może być filtr lub musi być w zapytaniu? Wygląda na to, że filtr może również wykonywać zapytania. Co sprawia, że ​​ten szaleństwo jest mylące. –

+0

Tak, filtry pobierają tylko 'i' /' lub ', a zapytania pobierają' must'/'should' i są dokładnie takie same (i = musi lub = powinno). Powodem, dla którego powinieneś wybrać kwerendy nad filtrami, jest ta odpowiedź SO, do której dołączyłem wcześniej. Łańcuch query_string przechodzi tylko pod część zapytania i jest to również wyjątek w "standardowej" strukturze zapytań. Dodam do tego przykład. Możesz zagnieździć "zapytanie" pod "filtrem", które zasadniczo pozwala łączyć zdolności zapytań w ramach tego samego przefiltrowanego zapytania. Jest to skomplikowane, wiem i masz rację ( –

+0

chcesz powiedzieć, że powinienem używać filtrów przez kwerendy w prawo? Z powodu buforowania filtrów? –