2015-09-28 13 views
5

Próbuję zaimplementować wewnętrzne trafienia za pomocą funkcji elasticsearch za pomocą Java API, ale nie mogę znaleźć wiele dokumentacji na ten temat lub przykłady, których używają inni ludzie. Mam wyszukiwania JSON, który działa następująco:Elasticsearch wewnętrzne trafienia w java api

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "nested": { 
      "path": "locations", 
      "filter": { 
      "geo_distance": { 
       "distance": "20km", 
       "locations.address.geoLocation": { 
       "lat": 38.07061, 
       "lon": -76.77514 
       } 
      } 
      }, 
      "inner_hits": {} 
     } 
     } 
    } 
    } 
} 

widzę metody InnerHitsBuilder i addInnerHit w bibliotece elasticsearch ale nie mogę znaleźć dokumentację na temat sposobu korzystania z nich.

Odpowiedz

7

Należy pamiętać, że w kodzie źródłowym ES znajduje się wiele przypadków testowych, w których testowana jest każda funkcja, więc przeglądanie kodu ES jest niezwykle bogatym źródłem informacji. Wewnętrzne hity nie stanowią wyjątku i możesz znaleźć wszystkie przypadki testowe inner_hits w klasie InnerHitsTests.java.

Więc zapytanie powyżej mogą być tworzone tak:

// build the geo_distance filter 
    GeoDistanceFilterBuilder geo = FilterBuilders 
      .geoDistanceFilter("locations.address.geoLocation") 
      .distance("20km") 
      .lat(38.07061) 
      .lon(-76.77514); 

    // build the nested filter and add inner_hits 
    NestedFilterBuilder nested = FilterBuilders 
      .nestedFilter("locations", geo) 
      .innerHit(new QueryInnerHitBuilder()); <--- this is what you're looking for 

    // wrap it all inside a filtered query 
    FilteredQueryBuilder query = QueryBuilders 
      .filteredQuery(QueryBuilders.matchAllQuery(), nested); 
Powiązane problemy