2016-08-17 57 views
5

W moim previous question zostałem wprowadzony do fields w zapytaniu query_string i jak może mi ono pomóc w przeszukiwaniu zagnieżdżonych pól dokumentu.Sposób korzystania z pól `gt` i` fields 'w tym samym zapytaniu w Elasticsearch

{ 
    "query": { 
    "query_string": { 
     "fields": ["*.id","id"], 
     "query": "2" 
    } 
    } 
} 

Ale działa tylko w dopasowywaniu, co jeśli chcę zrobić porównanie? Po pewnym przeczytaniu i przetestowaniu wydaje się, że zapytania takie jak range nie obsługują fields. Czy istnieje sposób, aby wykonać kwerendę range, np. w dniu, nad polem, które może być rozproszone w dowolnym miejscu w hierarchii dokumentów?

czyli biorąc pod uwagę następujący dokument:

{ 
    "id" : 1, 
    "Comment" : "Comment 1", 
    "date" : "2016-08-16T15:22:36.967489", 
    "Reply" : [ { 
     "id" : 2, 
     "Comment" : "Inner comment", 
     "date" : "2016-08-16T16:22:36.967489" 
    } ] 
} 

Czy istnieje kwerenda poszukiwania na polu date (jak date > '2016-08-16T16:00:00.000000'), który pasuje do danego dokumentu, ponieważ pola zagnieżdżonego, bez wyraźnie podając adres, na Reply.date? Coś takiego (wiem następujące zapytanie jest niepoprawne):

{ 
    "query": { 
     "range" : { 
      "date" : { 
       "gte" : "2016-08-16T16:00:00.000000", 
      }, 
      "fields": ["date", "*.date"] 
     } 
    } 
} 

Odpowiedz

3

range zapytania Sam tego nie obsługuje, jednak można wykorzystać zapytanie query_string (znowu) i fakt, że można wieloznacznych i pól że obsługuje zapytań klasy w celu osiągnięcia co trzeba:

{ 
    "query": { 
    "query_string": { 
     "query": "\*date:[2016-08-16T16:00:00.000Z TO *]" 
    } 
    } 
} 

powyższe zapytanie zwróci dokumentu, ponieważ Reply.date mecze *date

+0

mógłbyś wyjaśnić/odnoszą się do dokumentacji w kapelusz "\ *" robi? A czy powinienem używać "pól" jak poprzednio? – Mehran

+2

Jest w dokumencie [składnia zapytania w zapytaniu łańcuchowym] (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_field_names) w polu "Pole nazwy ". Nie musisz używać 'fields' w ogóle, wildcard czyni to niepotrzebnym. '\ * date' oznacza dowolne pole kończące się na' date' (włącznie z zagnieżdżonymi). Odwrotny ukośnik występuje, ponieważ musimy uciec z symbolu wieloznacznego '*', który jest zastrzeżonym znakiem w składni łańcucha zapytania. – Val