2014-09-16 9 views
15

Ich verwende ElasticSearch als Suchdienst im Spring Web-Projekt, das Transport Client für die Kommunikation mit ES verwendet.Wie erstellt man QueryBuilder aus JSON DSL, wenn man die Java API in ElasticSearch verwendet?

Ich frage mich, ob es eine Methode gibt, die einen QueryBuilder von einem JSON DSL konstruieren kann. Konvertieren Sie beispielsweise diese bool query DSL JSON in einen QueryBuilder.

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

Ich brauche diese Methode, weil ich Bool Zeichenfolge des Benutzereingabe zu empfangen haben von Web-Front-Seite und analysieren zu einer Querybuilder diese Bool String. Es ist jedoch nicht geeignet, QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB) zu verwenden. Weil wir möglicherweise mehrere müssen oder nicht müssen abfragen.

Wenn es eine Methode gibt, kann einen QueryBuilder von JSON DSL bauen oder es gibt alternative Lösungen, es wird viel einfacher.

PS: Ich habe zwei Methoden gefunden, die eine DSL-Zeichenfolge in eine QueryBuilder für ES-Suche umbrechen können. Eins ist WrapperQueryBuilder, sehen Sie Details hier. http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html Eine andere ist QueryBuilders.wrapperQuery (String DSL).

Antwort

9

Sie können setQuery verwenden, die eine Zeichenfolge im JSON-Format empfangen kann.

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

Hinweis dies: nur ein Teil des DSL benötigt wird, das {"query": } Teil weggelassen wird, wie folgt aus:

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

Vielen Dank für Ihre Antwort verwenden kann, habe ich zwei gefunden Methode in ES API, die DSL-String in QueryBuilder wickeln kann, ist einer WrapperQueryBuilder, ein anderer ist QueryBuilders.wrapperQuery() – Armstrongya

+0

weglassen die {"Query":} Teil hilft mir sehr, vielen Dank noch einmal für Ihre Hilfe. – Armstrongya

+0

Für diejenigen von Ihnen, die ES 5.0 verwenden, funktioniert das nicht mehr: https://discuss.elastic.co/t/set-source-in-searchrequestbuilder-with-es5-0-and-java-api/66870 –

11

Sie QueryBuilders.wrapperQuery(jsonQueryString);

Verwandte Themen