2013-02-25 11 views
5

Próbuję przejść od Solr do Elasticsearch, konwersję niektórych klas, które pracowałem z Solr do Elasticsearch, ale teraz utknąłem w tym.ElasticSearch odpowiednik Solr getBeans

W Solr Kiedyś miałem:

QueryResponse response = getServer().query(myQuery); 
List<MyClass> result = response.getBeans(MyClass.class); 

i to było to, mam listę z obiektami myClass że mogę używać, ale nie znalazłem odpowiednik dla getBeans w ElasticSearch Java API, jest tam coś podobnego albo muszę źródło wynikowy

searchHit.getSourceAsString(); 

lub

searchHit.getSource(); 

i przeanalizować wynik, aby utworzyć własną fasolę?

Każda pomoc lub wskaźnik we właściwym kierunku będzie bardzo doceniana.

Dzięki.

+0

Właśnie znalazłem: Pojo pojoBack = mapper.readValue (response.getSourceAsBytes(), Pojo.class); czy to jest właściwy sposób, aby to zrobić, czy jest jakiś inny sposób? Dzięki jeszcze raz! – im8bit

Odpowiedz

5

Elasticsearch pozwala przeczytać całą źródło w różnych formatach, wśród których najciekawsze dla Ciebie są:

  • jako String dzięki metodzie
  • jako Map<String, Object>SearchHit#sourceAsString poprzez metody
  • SearchHit#sourceAsMap

Należy pamiętać, że źródło nie jest jedynym sposobem, aby uzyskać wyniki z powrotem: można również poprosić o kilka konkretnych pól, które mogą być przechowywane w lucene lub automatycznie wczytywane ze źródła, gdy nie są przechowywane. Następnie można uzyskać metodę Map<String, SearchHitField> za pomocą metody SearchHit#fields.

Elasticsearch jest po prostu bardziej zorientowany na json niż Solr, zapewniając wysoce zoptymalizowane sposoby czytania i tworzenia obiektów json. O ile mi wiadomo, nie ma gotowego sposobu na odzyskanie obiektu Java bezpośrednio z SearchHit przy użyciu interfejsu Java API. Kiedyś było interesujące osem project, które wydaje się robić coś podobnego do tego, czego szukasz, ale nie wydaje się już być utrzymywane.

Istnieją różne biblioteki do transformacji obiektu Json w obiekt Java, jeśli naprawdę tego potrzebujesz. elasticsearch sam używa Jacksona wewnętrznie.

W przeciwnym razie alternatywą dla interfejsu Java API jest Jest client, który umożliwia indeksowanie i pobieranie dokumentów jako POJO. Ale w tym przypadku używałbyś zewnętrznej biblioteki, która wysyła wywołania Rest do elasticsearch zamiast do Java API, które są dość potężne. Z drugiej strony nie potrzebujesz całej elastycznej analizy jako zależności.

+0

Dziękuję za odpowiedź, uważam, że jest to poprawne, nie ma gotowego rozwiązania, musiałem wczoraj rozwiązać to szybko, więc używam jacksona do konwersji z json na takie obiekty java: ObjectMapper mapper = nowa ObjectMapper(); Pojo pojo = mapper.readValue (searchHit.getSourceAsString(), Pojo.class); -- Dzięki za pomoc! – im8bit