2016-09-27 2 views
0

was ich erreichen möchte sind: Erstellen Sie eine API, die in ElasticSearch suchen. Meine Programmiersprache ist Scala.Fehler konnte Wert nicht implizieren ToResponseMarshaller [SearchResponse]

//myRoute.scala

val pencarianES = 
    { 
    post 
    { 
     path("cariES") 
     { 
     parameters("xQuery", "xNilai") 
     { 
      (yQuery, yNilai) => 
      val PR = new ProsesRekomendasi 
      respondWithMediaType(MediaTypes.`application/json`) 
      { 
       complete 
       { 
       PR.ambilDariES(yQuery, yNilai) 
       } 
      } 
     } 
     } 
    } 
    } 

//prosesRekomendasi.scala

class ProsesRekomendasi 
{ 
    val ESM = new ESManager 
    val CLT = ESM.client 

    def ambilDariES(pQuery:String, pNilai:String) = 
    { 
    CLT.prepareSearch("app_lr_portal_01") 
     .setTypes("lr01") 
     .setQuery(QueryBuilders.termQuery(s"$pQuery",s"$pNilai")) 
     .execute() 
     .actionGet() 
    } 
} 

Fehler sind:

could not find implicit value for parameter marshaller: 
spray.httpx.marshalling.ToResponseMarshaller[org.eleasticsearch.action.search.SearchResponse] 
PR.ambilDariES(yQuery, yNilai) 

i wurde bei Google suchen, und gründete DefaultMarshallers missing with scala and spray-routing

und dann, im folgen Sie den Anweisungen:

def ambilDariES(pQuery:String, pNilai:String)(implicit ec:ExecutionContext) = 
    { 
    CLT.prepareSearch("app_lr_portal_01") 
     .setTypes("lr01") 
     .setQuery(QueryBuilders.termQuery(s"$pQuery",s"$pNilai")) 
     .execute() 
     .actionGet() 
    } 

schließlich bekomme ich einen anderen Fehler, die sind:

eine Idee, wie er damit umgehen? danke für Ihre Hilfe!

+0

Erstens würde ich Ihnen empfehlen, dass Sie Englisch für Ihre Codebeispiele verwenden, da es die kognitive Belastung einer Person verringert, die Ihren Code liest. Für den ersten Fehler - Spray weiß nicht, wie man SearchResponse marshallt, müssen Sie einen Marshaller explizit zur Verfügung stellen, wenn ElasticSearch API einen nicht zur Verfügung stellt. Diese Dokumentation sollte Ihnen eine Vorstellung von den nächsten Schritten geben: http://spray.io/documentation/1.2.2/spray-httpx/marshalling/ Für Ihren letzten Fehler - haben Sie versucht, das zu tun, was Sie von ihm verlangen? – Tim

+0

ok, verzeih mir @Tim. Ja, habe ich. hehe – SunBright

+0

herr @Tim, ich hatte ähnliches Problem wie SunBright. irgendeine Idee? –

Antwort

0

Obwohl das Erstellen von RootJsonFormat für Java-Klassen sehr mühsam ist, hier ein Beispiel für ein Ergebnis. Importieren Sie einfach in den Bereich:

object SearchResultProtocol { 

    implicit object SearchResulJsonFormatObject extends RootJsonFormat[SearchResponse] { 
    def read(e: JsValue) = null 


/* { 
"_shards":{ 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
}, 
"hits":{ 
    "total" : 1, 
    "hits" : [ 
     { 
      "_index" : "twitter", 
      "_type" : "tweet", 
      "_id" : "1", 
      "_source" : { 
       "user" : "kimchy", 
       "postDate" : "2009-11-15T14:12:12", 
       "message" : "trying out Elasticsearch" 
      } 
     } 
    ] 
} 
}*/ 

private def getHits(arr: Array[SearchHit]) : JsArray = { 
    JsArray(arr.map { x => marshallHit(x) }.toVector) 
} 


private def marshallHit(hit: SearchHit) : JsValue = { 
    JsObject(Map("_index" -> JsString(hit.index()), 
       "_type" -> JsString(hit.getType), 
       "_id" -> JsString(hit.getId), 
       "source" -> JsString(hit.getSourceAsString))) 
} 

def write(sr: SearchResponse) = { 
    JsObject(Map("_shards" -> 
       JsObject(Map("total" -> JsNumber(sr.totalShards()), 
          "successful" -> JsNumber(sr.getSuccessfulShards()), 
          "failed" -> JsNumber(sr.getFailedShards()))), 
       "hits" -> JsObject(Map("total" -> JsNumber(sr.getHits.totalHits()), 
             "" -> getHits(sr.getHits.getHits) 
              )))) 

} 
} 

} 
+0

Hallo @ EmiCareOfCell44, bekomme ich ein Problem wie SunBright. Wo ist muss, habe ich den Code wie deine Antwort? Vielen Dank! –

+0

Ja, importieren Sie SearchResultProtocol._ und der Compiler findet den Serializer. – EmiCareOfCell44

+0

wo finde ich SearchResultProtocol._? @ EmiCareOfCell44 –

Verwandte Themen