2013-01-12 14 views
8

Niedawno zacząłem badać świat wyszukiwań i próbuję użyć ES jako indeksu dla mojego MongoDB. Udało mi się je z powodzeniem zintegrować, ale uważam, że interfejs API wyszukiwania jest dość skomplikowany i mylący. Interfejs API Java też nie jest zbyt pomocny. Jestem w stanie znaleźć dokładne dopasowania, ale jak mogę wyszukiwać pełnotekstowe? Tu jest mój kodu:ElasticSearch wyszukiwanie pełnotekstowe za pomocą Java API

Settings settings = ImmutableSettings.settingsBuilder() 
    .put("cluster.name", "elasticsearch").build(); 
Client client = new TransportClient(settings) 
    .addTransportAddress(new InetSocketTransportAddress("host-ip", 9300)); 
SearchResponse response = client.prepareSearch("mongoindex") 
    .setSearchType(SearchType.QUERY_AND_FETCH) 
    .setQuery(termQuery("name", "*name*")) 
    .setFrom(0).setSize(60).setExplain(true) 
    .execute() 
    .actionGet(); 

mam żadnych problemów ze znalezieniem "name":"testname" użyciu .setQuery(termQuery("name", "testname")), ale "name":"this is a test name" nie działa w powyższym przykładzie. Co ja robię źle?

+0

to tylko baza danych, które używam. –

Odpowiedz

8

Po przeszukiwaniu Internetu przez wiele godzin, udało mi się go rozwiązać, korzystając z pomocy javadocs. Najważniejszy jest interfejs *QueryBuilder* i jego klasy implementacyjne. Użyłem FieldQueryBuilder dla mojego zapytania, które pokazano w metodzie setQuery poniżej.

SearchResponse response = client.prepareSearch("mongoindex") 
    .setSearchType(SearchType.QUERY_AND_FETCH) 
    .setQuery(fieldQuery("name", "test name")) 
    .setFrom(0).setSize(60).setExplain(true) 
    .execute() 
    .actionGet(); 
SearchHit[] results = response.getHits().getHits(); 
for (SearchHit hit : results) { 
    System.out.println(hit.getId()); //prints out the id of the document 
    Map<String,Object> result = hit.getSource(); //the retrieved document 
} 

Z powstałego obiektu mapy, wystarczy wywołać metodę get pobrać odpowiednie dane.

0

Wygląda na to, że termQuery in elasticsearch używa Lucence do wyszukiwania składni. Zgodnie z Lucene docs symbol wieloznaczny "*" nie jest dozwolony jako pierwszy termin wyszukiwania.

+0

jeśli tak, jak mogę wyszukać frazę (lub podłańcuch) w tekście? –

+0

Zgaduję, używając query_string http://www.elasticsearch.org/guide/reference/query-dsl/query-string-query.html – mjhm

+0

Niestety, to nie jest w Javie, co jest sednem mojego pytania, jak używam Java API. Widziałem link, ale nie mogę przetłumaczyć go na język Java. –

Powiązane problemy