2013-01-12 13 views
8

Ho recentemente iniziato ad esplorare il mondo della ricerca e sto cercando di utilizzare ES come indice per il mio MongoDB. Sono riuscito a integrarli con successo, ma trovo l'API di ricerca piuttosto complessa e confusa. L'API Java non è troppo utile neanche. Sono in grado di trovare corrispondenze esatte, ma come faccio le ricerche full-text? Qui è il mio codice:ElasticSearch ricerca full text tramite 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(); 

non ho problemi a trovare "name":"testname" utilizzando .setQuery(termQuery("name", "testname")), ma "name":"this is a test name" non funziona con l'esempio precedente. Che cosa sto facendo di sbagliato?

+0

che è solo il database che sto usando. –

risposta

8

Dopo aver analizzato Internet per ore, sono riuscito a capirlo, con l'aiuto dello javadocs. La più importante è l'interfaccia *QueryBuilder* e le sue classi di implementazione. Ho usato FieldQueryBuilder per la mia query, che è mostrata nel metodo setQuery qui sotto.

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 
} 

Con l'oggetto mappa risultante, si può semplicemente chiamare il metodo get per recuperare i dati rilevanti.

0

Sembra che termQuery in elasticsearch utilizzi Lucence per la sintassi di ricerca. Secondo lo Lucene docs, il carattere jolly "*" non è consentito come primo termine di una ricerca.

+0

in questo caso, come posso cercare una frase (o sottostringa) all'interno del testo? –

+0

Direi di usare una query_string http://www.elasticsearch.org/guide/reference/query-dsl/query-string-query.html – mjhm

+0

Sfortunatamente, questo non è in Java, che è davvero il punto cruciale della mia domanda, mentre sto usando l'API Java. Ho visto il collegamento ma non riesco a tradurlo in Java. –

Problemi correlati