Я нашел один способ сделать это, но он требует, чтобы вы создали скрипт, который живет на узле Elastic. См. Файловые сценарии . Это не очень гибко, но попробуйте. Вот что нужно сделать.
Создайте файл с именем template_doctype.mustache
и скопируйте его в $ELASTIC_HOME/config/scripts
. Это сценарий, который вы можете адаптировать по мере необходимости. Перезапустите Elastic или подождите 60 секунд, пока он перезагрузится.
{
"query" : {
"match" : {
"type" : "{{param_type}}"
}
}
}
Мои pom.xml
зависимости:
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
(К вашему сведению, используя mvn dependency:tree
, я обнаружил, что ваша версия spring-data-elasticsearch
неявно использует версию 5.5 библиотеки ElasticSearch, даже если вы используете ElasticSearch 6.)
Создать фиктивный индекс:
curl -X PUT http://localhost:9200/myindex
Создайте пару документов, которые можно использовать для сопоставления, чтобы обеспечить работоспособность кода:
curl -X POST http://localhost:9200/myindex/mydoc -d '{"title":"foobar", "type":"book"}'
curl -X POST http://localhost:9200/myindex/mydoc -d '{"title":"fun", "type":"magazine"}'
Попробуйте выполнить запрос. Этот код должен возвращать один документ:
String clusterName = "my-application";
Settings elasticsearchSettings = Settings.builder().put("cluster.name", clusterName).build();
TransportClient client = new PreBuiltTransportClient(elasticsearchSettings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"),9300));
Map<String, Object> template_params = new HashMap<>();
// Here is where you put parameters to your script.
template_params.put("param_type", "book");
SearchResponse sr = new SearchTemplateRequestBuilder(client)
.setScript("template_doctype") // this is where you specify what template to use
.setScriptType(ScriptType.FILE)
.setScriptParams(template_params)
.setRequest(new SearchRequest())
.get()
.getResponse();
SearchHit[] results = sr.getHits().getHits();
for(SearchHit hit : results){
String sourceAsString = hit.getSourceAsString();
if (sourceAsString != null) {
Gson gson = new GsonBuilder().setPrettyPrinting()
.create();
Map map = gson.fromJson(sourceAsString, Map.class);
System.out.println( gson.toJson(map));
}
}
Выход:
{
"title": "foobar",
"type": "book"
}