2016-10-19 2 views
0

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?

+0

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

+0

Ja, es wird eine Konstantscore-Abfrage durchgeführt – Willem

Antwort

0

Für diejenigen, die interessiert sind, löste ich mit einem Template und der setTemplate Methode mein Problem.

@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"); 

       Template template = new Template("megacorpTemplate", ScriptService.ScriptType.INDEXED, MustacheScriptEngineService.NAME, null, templateParams); 
       SearchRequestBuilder request = client.prepareSearch("megacorp").setTemplate(template); 
       SearchResponse searchResponse = request.execute().actionGet(); 

       System.out.println(searchResponse.toString()); 
     } 
     catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
    } 
Verwandte Themen