Ich verstehe nicht, wie Sie searchTemplates in der Java API von Elasticsearch richtig verwenden. Meine Vorlage scheint gut zu funktionieren, wenn ich es im Sinn teste. Aber wenn ich die Vorlage in Java-Code verwende, gibt es andere Ergebnisse.Verwendung elasticsearch Suchtemplate in Java API
Hier ist, was ich tun
DELETE /megacorp
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
GET /megacorp/_search
{
"query": {"match": {
"about": "rock"
}}
}
Das gibt:
{
"took": 9,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.11506981,
"hits": [
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_score": 0.11506981,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
}
]
}
}
Damit sieht nett aus: eine Punktzahl von 0.115. Jetzt erstelle ich eine searchTemplate
DELETE /_search/template/megacorpTemplate
POST /_search/template/megacorpTemplate
{
"template": {
"query": {
"match": {
"about": "{{txt}}"
}
}
}
}
Und es verwenden:
GET /megacorp/_search/template
{
"id": "megacorpTemplate",
"params": {
"txt": "rock"
}
}
Es gibt:
{
"took": 35,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.11506981,
"hits": [
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_score": 0.11506981,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
}
]
}
}
Also, alles gut und gut. Aber jetzt kommt das Problem. Wenn ich dieses searchTemplate in meinem Java-Code verwenden möchte, scheine ich einige Informationen zu verlieren, zum Beispiel ist die Punktzahl 1,0 und meine Skriptfelder sind verloren (in diesem Beispiel der Kürze halber entfernt). Hier ist mein Code:
@Test
public void quickTest2() {
Client client;
try {
client = TransportClient.builder().build().addTransportAddress(
new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
Map<String,Object> templateParams = new HashMap<>();
templateParams.put("txt", "rock");
QueryBuilder tqb = QueryBuilders.templateQuery(
"megacorpTemplate",
ScriptService.ScriptType.INDEXED,
templateParams);
SearchResponse searchResponse = client.prepareSearch("megacorp")
.setQuery(tqb)
.execute()
.actionGet();
System.out.println(searchResponse.toString());
}
catch (UnknownHostException e) {
e.printStackTrace();
}
}
Es gibt:
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "megacorp",
"_type" : "employee",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests" : [ "sports", "music" ]
}
} ]
}
}
Warum ist meine Punktzahl 1.0 jetzt anstelle von 0,115?
Wenn Sie '.setExplain (true)' zu Ihrer 'prepareSearch' hinzufügen, was sagt es? Ich nehme an, dass es eine Constantscore-Abfrage macht. Ich denke auch, dass Sie "/ _search/template/megacorpTemplate" anstelle von "POST" auf "PUT" setzen möchten. – Phil
Ja, es wird eine Konstantscore-Abfrage durchgeführt – Willem