2014-09-16 14 views
15

Tôi đang sử dụng ElasticSearch làm dịch vụ tìm kiếm trong dự án Spring Web sử dụng Transport Client để giao tiếp với ES.Làm thế nào để xây dựng QueryBuilder từ JSON DSL khi sử dụng Java API trong ElasticSearch?

Tôi tự hỏi nếu có tồn tại một phương pháp có thể xây dựng một QueryBuilder từ một DSL JSON. ví dụ, chuyển đổi truy vấn bool DSL DSL này thành QueryBuilder.

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

Tôi cần phương pháp này vì tôi phải nhận chuỗi đầu vào bool của người dùng từ phía trước web và phân tích chuỗi bool này thành QueryBuilder. Tuy nhiên nó không phù hợp để sử dụng QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB). Bởi vì chúng tôi có thể cần một số phải hoặc không phải truy vấn.

Nếu tồn tại một phương pháp có thể xây dựng QueryBuilder từ JSON DSL hoặc có giải pháp thay thế, nó sẽ dễ dàng hơn nhiều.

PS: Tôi đã tìm thấy hai phương pháp có thể quấn một chuỗi DSL vào một QueryBuilder cho tìm kiếm ES. Một là WrapperQueryBuilder, xem chi tiết tại đây. http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html Một số khác là QueryBuilders.wrapperQuery (Chuỗi DSL).

Trả lời

9

Bạn có thể sử dụng setQuery, có thể nhận được chuỗi định dạng json.

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

Lưu ý này: chỉ một phần của DSL là cần thiết, phần {"query": } được bỏ qua, như thế này:

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

Cám ơn câu trả lời của bạn, tôi đã tìm thấy hai phương pháp trong ES API có thể quấn chuỗi DSL để QueryBuilder, một là WrapperQueryBuilder, một là QueryBuilders.wrapperQuery() – Armstrongya

+0

bỏ qua phần {"truy vấn":} giúp tôi rất nhiều, một lần nữa nhờ sự giúp đỡ của bạn. – Armstrongya

+0

Đối với những người bạn sử dụng ES 5.0, điều này không còn hoạt động: https://discuss.elastic.co/t/set-source-in-searchrequestbuilder-with-es5-0-and-java-api/66870 –

11

Bạn có thể sử dụng QueryBuilders.wrapperQuery(jsonQueryString);

Các vấn đề liên quan