2014-09-16 25 views
15

Uso ElasticSearch come servizio di ricerca nel progetto Spring Web che utilizza Transport Client per comunicare con ES.Come costruire QueryBuilder da JSON DSL quando si utilizza l'API Java in ElasticSearch?

Mi chiedo se esiste un metodo che può costruire un QueryBuilder da un DSL JSON. ad esempio, convertire questa query bool DSL JSON in QueryBuilder.

{ 
    "query" : { 
     "bool" : { 
      "must" : { "match" : {"content" : "quick"}, 
      "should": { "match": {"content" : "lazy"} 
     } 
    } 
} 

ho bisogno di questo metodo perché devo ricevere input stringa bool dell'utente da web front-side, e analizzare questa stringa bool ad un QueryBuilder. Tuttavia non è adatto all'uso di QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB). Perché potremmo aver bisogno di più query must o non must.

Se esiste un metodo in grado di costruire un QueryBuilder da JSON DSL o esistono soluzioni alternative, sarà molto più semplice.

PS: Ho trovato due metodi che possono eseguire il wrapping di una stringa DSL su QueryBuilder per la ricerca ES. Uno è WrapperQueryBuilder, vedere i dettagli qui. http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html Un altro è QueryBuilders.wrapperQuery (stringa DSL).

risposta

9

È possibile utilizzare setQuery, che può ricevere una stringa di formato json.

/** 
* Constructs a new search source builder with a raw search query. 
*/ 
public SearchRequestBuilder setQuery(String query) { 
    sourceBuilder().query(query); 
    return this; 
} 

Nota questo: solo una parte della DSL è necessario, la parte {"query": } viene omesso, in questo modo:

SearchResponse searchResponse = client.prepareSearch(indices).setQuery("{\"term\": {\"id\": 1}}").execute().actionGet(); 
+0

Grazie per la risposta, ho trovato due metodo in ES API che può avvolgere stringa DSL in QueryBuilder, uno è WrapperQueryBuilder, un altro è QueryBuilders.wrapperQuery() – Armstrongya

+0

omettere la {"query":} la parte mi aiuta molto, grazie ancora per il tuo aiuto. – Armstrongya

+0

Per coloro che utilizzano ES 5.0, questo non funziona più: https://discuss.elastic.co/t/set-source-in-searchrequestbuilder-with-es5-0-and-java-api/66870 –

11

È possibile utilizzare QueryBuilders.wrapperQuery(jsonQueryString);