2014-09-16 1 views
15

Я использую ElasticSearch в качестве службы поиска в проекте Spring Web, который использует Transport Client для связи с ES.Как построить QueryBuilder из JSON DSL при использовании Java API в ElasticSearch?

Мне интересно, существует ли метод, который может построить QueryBuilder из JSON DSL. например, преобразовать этот запрос bool DSL JSON в QueryBuilder.

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

мне нужен этот метод, потому что я должен получить пользователь ввод BOOL строки из веба передней стороны, и разобрать эту булеву строку в QueryBuilder. Однако это не подходит для использования QueryBuilders.boolQuery().must(matchQB).should(shouldQB).must_not(mustNotQB). Потому что нам могут потребоваться несколько запросов или не должны запрашивать.

Если существует способ, который может построить QueryBuilder из JSON DSL или существуют альтернативные решения, это будет намного проще.

PS: Я нашел два метода, которые могут обернуть DSL-строку в QueryBuilder для поиска ES. Один из них - WrapperQueryBuilder, см. Подробности здесь. http://javadoc.kyubu.de/elasticsearch/HEAD/org/elasticsearch/index/query/WrapperQueryBuilder.html Другое QueryBuilders.wrapperQuery (String DSL).

ответ

9

Вы можете использовать setQuery, который может принимать строку формата json.

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

Примечание это: только часть DSL требуется, то {"query": } часть опускается, например:

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

Спасибо за ваш ответ, я нашел два метод в ES API, который может обернуть строку DSL в QueryBuilder, другой - WrapperQueryBuilder, другой - QueryBuilders.wrapperQuery() – Armstrongya

+0

опустить часть {"query::}, которая мне очень помогает, еще раз спасибо за вашу помощь. – Armstrongya

+0

Для тех из вас, кто использует ES 5.0, это больше не работает: https://discuss.elastic.co/t/set-source-in-searchrequestbuilder-with-es5-0-and-java-api/66870 –

11

Вы можете использовать QueryBuilders.wrapperQuery(jsonQueryString);

 Смежные вопросы

  • Нет связанных вопросов^_^