2016-08-04 18 views
0

enter image description here "SearchPhaseExecutionException in Elasticsearch

Ich bin mit Elasticsearch 1.7.5 Nach Indexnamen erstellen" geo_ip "Ich benutze Java-Code-Snippet belows, um Feld zu suchen country mit dem Namen Turkey.

String index = "geo_ip"; 
     String type = "ip"; 
     String field = "country"; 
     String value = "Turkey"; 
     Map<String, String> query = new HashMap<>(); 
     query.put(field, value); 
     // create client 
     TransportClient client = EsLoading.settingElasticSearch(); 
     // searching 
     SearchResponse response = client.prepareSearch(index) 
       .setTypes(type) 
       .setSearchType(SearchType.QUERY_AND_FETCH) 
       .setQuery(query) 
       .setFrom(0).setSize(60).setExplain(true) 
       .execute() 
       .actionGet(); 

     SearchHit[] result = response.getHits().getHits(); 
     System.out.println("Current result: "+result.length); 

Aber danach hat es Problem wie folgt:

Exception in thread "main" org.elasticsearch.action.search.SearchPhaseExecutionException: Failed to execute phase [query_fetch], all shards failed; shardFailures {[uVH-OgzjQfuUV8Bg_nViHQ][geo_ip][0]: SearchParseException[[geo_ip][0]: from[0],size[60]: Parse Failure [Failed to parse source [{"from":0,"size":60,"query":{"country":"Turkey"},"explain":true}]]]; nested: QueryParsingException[[geo_ip] [_na] query malformed, no field after start_object]; }{[uVH-OgzjQfuUV8Bg_nViHQ][geo_ip][1]: SearchParseException[[geo_ip][1]: from[0],size[60]: Parse Failure [Failed to parse source [{"from":0,"size":60,"query":{"country":"Turkey"},"explain":true}]]]; nested: QueryParsingException[[geo_ip] [_na] query malformed, no field after start_object]; }{[uVH-OgzjQfuUV8Bg_nViHQ][geo_ip][2]: SearchParseException[[geo_ip][2]: from[0],size[60]: Parse Failure [Failed to parse source [{"from":0,"size":60,"query":{"country":"Turkey"},"explain":true}]]]; nested: QueryParsingException[[geo_ip] [_na] query malformed, no field after start_object]; }{[uVH-OgzjQfuUV8Bg_nViHQ][geo_ip][3]: SearchParseException[[geo_ip][3]: from[0],size[60]: Parse Failure [Failed to parse source [{"from":0,"size":60,"query":{"country":"Turkey"},"explain":true}]]]; nested: QueryParsingException[[geo_ip] [_na] query malformed, no field after start_object]; }{[uVH-OgzjQfuUV8Bg_nViHQ][geo_ip][4]: SearchParseException[[geo_ip][4]: from[0],size[60]: Parse Failure [Failed to parse source [{"from":0,"size":60,"query":{"country":"Turkey"},"explain":true}]]]; nested: QueryParsingException[[geo_ip] [_na] query malformed, no field after start_object]; } 
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.onFirstPhaseResult(TransportSearchTypeAction.java:237) 
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction$1.onFailure(TransportSearchTypeAction.java:183) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$23.run(SearchServiceTransportAction.java:565) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Kann mir jemand helfen, das zu umgehen? Danke.

Antwort

1

Ihr country Feld wahrscheinlich analysiert wird, so dass Sie mit Klein turkey abfragen müssen. Versuchen Sie stattdessen:

SearchResponse response = client.prepareSearch(index) 
      .setTypes(type) 
      .setSearchType(SearchType.QUERY_AND_FETCH) 
      .setQuery(QueryBuilders.termQuery("country", "turkey")) 
      .setFrom(0).setSize(60).setExplain(true) 
      .execute() 
      .actionGet(); 

Oder verwenden Sie einen match Abfrage (mit entweder turkey oder Turkey) wie folgt aus:

SearchResponse response = client.prepareSearch(index) 
      .setTypes(type) 
      .setSearchType(SearchType.QUERY_AND_FETCH) 
      .setQuery(QueryBuilders.matchQuery("country", "Turkey")) 
      .setFrom(0).setSize(60).setExplain(true) 
      .execute() 
      .actionGet(); 
+0

Können Sie mir den Unterschied zwischen analysiert und nicht analysiert zeigen. Danke – VanThaoNguyen

+0

Diese Antwort könnte helfen: http://stackoverflow.com/questions/37532648/analyzed-or-not-analyzed-what-to-choose – Val

1

Es ist besser, Java Api zu verwenden, um eine Abfrage zu erstellen: https://www.elastic.co/guide/en/elasticsearch/client/java-api/1.7/search.html

Ihre Anfrage ist auch falsch. Sie sollten einen Abfragetyp wie term angeben:

{ 
    "from" : 0, 
    "size" : 60, 
    "query" : 
    { 
     "term" : 
     { 
      "country" : "Turkey" 
     } 
    }, 
    "explain" : true 
} 
+0

ich Ihr sugesstion. Search response = client.prepareSearch (Index) .setTypes (Typ) .setSearchType (SearchType.DEFAULT) .setQuery (QueryBuilders.termQuery ("Land", "Türkei")) .setFrom (0) .setSize (10000) .setExplain (true) .execute() .actionGet(); Aber es ausdrucken Länge der "Antwort" ist Null. Ich denke, ich arbeite nicht gut – VanThaoNguyen

+0

Was ist das Ergebnis von "curl -XGET host: 9200/_cat/shards"? – alpert