How to query in elasticsearch

305 views
Skip to first unread message

Sanx

unread,
Dec 1, 2012, 7:41:52 PM12/1/12
to Lift

0
down vote
favorite
I Integrating MongoDB with Elastic Search

I have indexed the collection "person" in the database "testmongo"
from the terminal with the following command:

curl -XPUT 'http://localhost:9200/_river/mongodb/_meta' -d '{
"type": "mongodb",
"mongodb": {
"db": "testmongo",
"collection": "person"
},
"index": {
"name": "mongoindex",
"type": "person"
}
}'
and add some data to the mongodb through mongo terminal:

use testmongo
var p = {firstName: "John", lastName: "Doe"}
db.person.save(p)
Use this command to search the data:

curl -XGET 'http://localhost:9200/mongoindex/_search?q=firstName:John'
Until here everything works perfectly

My problem is this:

How to, I have to create the client node to query I have the following
code does not work:

package code
package snippet

import net.liftweb._
import http._
import common._
import util.Helpers._
import scala.xml._
import org.elasticsearch.node.NodeBuilder._
import org.elasticsearch.index.query.QueryBuilders._
import collection.JavaConversions._


class SearchTerms extends StatefulSnippet with Loggable{


private var term = ""

def dispatch = {
case "render" => render _
}

def render( xhtml: NodeSeq ): NodeSeq = {

def doSearchTerm {

val node = nodeBuilder().client(true).node()
val client = node.client()

val query = queryString( term )
val response = client
.prepareSearch("A")
.setTypes("B")
.setQuery(query)
.execute()
.actionGet()

val hits = response.getHits

logger.info( "Found %d hits for query
'%s'".format( hits.getTotalHits, term ) )

hits.getHits.foreach(hit =>
logger.info("* %s".format(hit.sourceAsMap()("text")))
)

client.close()
node.close()
}
What are the values that I have to use in A and B to use the search
function in scala lift

can someone please help me

thank you very much for your attention

Diego Medina

unread,
Dec 1, 2012, 7:52:05 PM12/1/12
to lif...@googlegroups.com

I use elastic from one of my lift apps, but I don't use the java client, I use twitter Finagle to query ES. I do this because there are so many more examples of the json to send to ES than java code, plus, I can do all my testing, initial implementation using curl and then just copy paste the json that I know works.

Hope that helps

Diego
Sent from my android cell

--
--
Lift, the simply functional web framework: http://liftweb.net
Code: http://github.com/lift
Discussion: http://groups.google.com/group/liftweb
Stuck? Help us help you: https://www.assembla.com/wiki/show/liftweb/Posting_example_code



Sanx

unread,
Dec 2, 2012, 1:34:16 AM12/2/12
to Lift
Thanks for the answer Diego

Do you any code example that you can share for testing?


On 1 dic, 18:52, Diego Medina <di...@fmpwizard.com> wrote:
> I use elastic from one of my lift apps, but I don't use the java client, I
> use twitter Finagle to query ES. I do this because there are so many more
> examples of the json to send to ES than java code, plus, I can do all my
> testing, initial implementation using curl and then just copy paste the
> json that I know works.
>
> Hope that helps
>
> Diego
> Sent from my android cell

Diego Medina

unread,
Dec 2, 2012, 2:54:13 AM12/2/12
to Lift
Here is the main object I use to send data

https://gist.github.com/4187645

From my snippets I generate the proper json with lift-json and then I
do something like:


ElasticSearch.inventorySave(path, json)

to save a new entry on myelastic search index.

Regards,

Diego
--
Diego Medina
Lift/Scala Developer
di...@fmpwizard.com
http://www.fmpwizard.com

Sanx

unread,
Dec 21, 2012, 8:32:29 PM12/21/12
to Lift
Thanks for the reply and for sharing your code

I've been testing

for example, if I want to do the following:

curl -XGET http://localhost:9200/mongoindex/_search -d '{ "query" :
{"term" : { "name": "dos" }}}'

then the following function, I have to change this:

def inventorySearch(json: JValue): Future[HttpResponse] ={
val req = requestBuilderGet(List("inventory" , "main", "_search"),
json)
sendToElastic(req)
}

by this:

def inventorySearch(json: JValue): Future[HttpResponse] ={
val req = requestBuilderGet(List("mongoindex", "_search"), json)
sendToElastic(req)
}

and in my Snippet, do something like:

ElasticSearch.inventorySearch(json)

and the value of json put this:

val json = parse(""" { "query" : { "term" : { "name": """" + name +
"""" }}} """)

is this correct?

and I have the following question:

how I can get the values of the function "inventorySearch" returns?

thank you very much for the attention
I hope you can help me

Diego Medina

unread,
Dec 27, 2012, 12:17:42 PM12/27/12
to Lift
Hi,


Yes, the changes you made were correct, basically, I had the index and
type hardcoded to my app needs.

About getting the results, I am using twitter finagle to query elastic
search, so, you get a Future with the result. You can read here more
about how to work with finagle

https://github.com/twitter/finagle


if you can, you could use the call back way
https://github.com/twitter/finagle#Future%20Callbacks
but sometimes you just need the data, and are ok blocking on it, so
you can do something like:


val result = searchElastic(..).get // I think that's what you use,
I'm not at my laptop.

so then you have the result right there. (You may need to extract the
body of the reply and use lift json to get the data out of the
response)

Hope that helps.

Diego

Sanx

unread,
Jan 8, 2013, 12:32:19 PM1/8/13
to Lift
Thanks for your reply Diego

everything works fine, I can view the data in JSON format:

ElasticSearch.inventorySearch(json)onSuccess {
    response =>
    println("\nReceived response: \n\n" +
response.getContent.toString("UTF-8") + "\n")
}

I use the "extract" method for retrieving data, but did not succeed
I read the documentation on this site:

https://www.assembla.com/spaces/liftweb/wiki/JSON_Support

something I'm doing wrong and do not understand what I'm missing

do you have a sugestion?


On 27 dic 2012, 11:17, Diego Medina <di...@fmpwizard.com> wrote:
> Hi,
>
> Yes, the changes you made were correct, basically, I had the index and
> type hardcoded to my app needs.
>
> About getting the results, I am using twitter finagle to query elastic
> search, so, you get a Future with the result. You can read here more
> about how to work with finagle
>
> https://github.com/twitter/finagle
>
> if you can, you could use the call back wayhttps://github.com/twitter/finagle#Future%20Callbacks
> but sometimes you just need the data, and are ok blocking on it, so
> you can do something like:
>
> val result = searchElastic(..).get   // I think that's what you use,
> I'm not at my laptop.
>
> so then you have the result right there. (You may need to extract the
> body of the reply and use lift json to get the data out of the
> response)
>
> Hope that helps.
>
>   Diego
>
>
>
>
>
>
>
>
>
> On Fri, Dec 21, 2012 at 8:32 PM, Sanx <hectorg...@gmail.com> wrote:
> > Thanks for the reply and for sharing your code
>
> > I've been testing
>
> > for example, if I want to do the following:
>
> > curl -XGEThttp://localhost:9200/mongoindex/_search-d '{ "query" :

Sanx

unread,
Jan 9, 2013, 8:10:46 PM1/9/13
to Lift
Regards

I have been trying other things, like this:

> console

import net.liftweb.json._
import code.lib.ElasticSearch
val json = parse(""" { "query" : { "term" : { "name": "dos" }}} """)
implicit val formats = DefaultFormats

ElasticSearch.mongoindexSearch( json ) onSuccess {
response => println("\nReceived response: \n\n" +
parse( response.getContent.toString("UTF-8") ) + "\n")
}

and get the following:


Received response:

JObject(List(JField(took,JInt(6)), JField(timed_out,JBool(false)),
JField(_shards,JObject(List(JField(total,JInt(5)),
JField(successful,JInt(5)), JField(failed,JInt(0))))),
JField(hits,JObject(List(JField(total,JInt(1)),
JField(max_score,JDouble(1.9162908)),
JField(hits,JArray(List(JObject(List(JField(_index,JString(mongoindex)),
JField(_type,JString(posts)),
JField(_id,JString(508d53c73004fa29f951ceeb)),
JField(_score,JDouble(1.9162908)),
JField(_source,JObject(List(JField(_id,JString(508d53c73004fa29f951ceeb)),
JField(name,JString(dos)), JField(description,JString(dos)),
JField(userId,JString(50510321300407585a3d7e01)),
JField(timecreated,JInt(1351439303854)),
JField(published,JBool(true)))))))))))))))

and now, what I need is to extract the data

I'm trying this:

case class Posts(name: String, description: String )


ElasticSearch.mongoindexSearch( json ) onSuccess {
response => println("\nReceived response: \n\n" +
parse( response.getContent.toString("UTF-8") ).extract[Posts] + "\n")
}

but I get the following Exception:

GRAVE: Exception propagated to the root monitor!
net.liftweb.json.MappingException: No usable value for name
Did not find value which can be converted into java.lang.String
at net.liftweb.json.Meta$.fail(Meta.scala:191)
at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:
357)
at net.liftweb.json.Extraction$.build$1(Extraction.scala:317)
at net.liftweb.json.Extraction$$anonfun
$12.apply(Extraction.scala:253)
at net.liftweb.json.Extraction$$anonfun
$12.apply(Extraction.scala:253)
at scala.collection.TraversableLike$$anonfun$map
$1.apply(TraversableLike.scala:194)
at scala.collection.TraversableLike$$anonfun$map
$1.apply(TraversableLike.scala:194)
at scala.collection.LinearSeqOptimized
$class.foreach(LinearSeqOptimized.scala:59)
at scala.collection.immutable.List.foreach(List.scala:45)
at scala.collection.TraversableLike
$class.map(TraversableLike.scala:194)
at scala.collection.immutable.List.map(List.scala:45)
at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:
253)
at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:
286)
at net.liftweb.json.Extraction$.build$1(Extraction.scala:315)
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$
$extract0(Extraction.scala:366)
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$
$extract0(Extraction.scala:199)
at net.liftweb.json.Extraction$.extract(Extraction.scala:43)
at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:300)
at $line7.$read$$iw$$iw$$iw$$iw$$anonfun$1.apply(<console>:17)
at $line7.$read$$iw$$iw$$iw$$iw$$anonfun$1.apply(<console>:17)
at com.twitter.util.Future$$anonfun$onSuccess
$1.apply(Future.scala:514)
at com.twitter.util.Future$$anonfun$onSuccess
$1.apply(Future.scala:513)
at com.twitter.util.Promise$$anonfun$respond$2$$anonfun$apply
$1.apply$mcV$sp(Future.scala:853)
at com.twitter.util.Monitor$.apply(Monitor.scala:119)
at com.twitter.util.Promise$$anonfun$respond
$2.apply(Future.scala:853)
at com.twitter.util.Promise$$anonfun$respond
$2.apply(Future.scala:853)
at com.twitter.util.Promise$$anonfun$respondWithoutChaining
$1.apply(Future.scala:864)
at com.twitter.util.Promise$$anonfun$respondWithoutChaining
$1.apply(Future.scala:859)
at com.twitter.concurrent.IVar$$anonfun$runqs$1.apply$mcV
$sp(IVar.scala:174)
at com.twitter.concurrent.IVar$LocalScheduler.run(IVar.scala:
125)
at com.twitter.concurrent.IVar$LocalScheduler.apply(IVar.scala:
105)
at com.twitter.concurrent.IVar.runqs(IVar.scala:169)
at com.twitter.concurrent.IVar.set(IVar.scala:310)
at com.twitter.util.Promise.updateIfEmpty(Future.scala:834)
at com.twitter.util.Promise.update(Future.scala:821)
at com.twitter.util.Promise.setValue(Future.scala:804)
at com.twitter.concurrent.AsyncQueue.offer(AsyncQueue.scala:
66)
at
com.twitter.finagle.transport.ClientChannelTransport.handleUpstream(ChannelTransport.scala:
125)
at
org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:
564)
at org.jboss.netty.channel.DefaultChannelPipeline
$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:
792)
at
org.jboss.netty.handler.codec.http.HttpContentDecoder.messageReceived(HttpContentDecoder.java:
100)
at
org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:
75)
at
org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:
564)
at org.jboss.netty.channel.DefaultChannelPipeline
$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:
792)
at
org.jboss.netty.handler.codec.http.HttpChunkAggregator.messageReceived(HttpChunkAggregator.java:
111)
at
org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:
75)
at
org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:
564)
at org.jboss.netty.channel.DefaultChannelPipeline
$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:
792)
at
org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:
296)
at
org.jboss.netty.handler.codec.replay.ReplayingDecoder.unfoldAndFireMessageReceived(ReplayingDecoder.java:
567)
at
org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:
551)
at
org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:
445)
at
org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:
75)
at
org.jboss.netty.handler.codec.http.HttpClientCodec.handleUpstream(HttpClientCodec.java:
92)
at
org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:
564)
at org.jboss.netty.channel.DefaultChannelPipeline
$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:
792)
at
org.jboss.netty.channel.SimpleChannelHandler.messageReceived(SimpleChannelHandler.java:
149)
at
com.twitter.finagle.channel.ChannelStatsHandler.messageReceived(ChannelStatsHandler.scala:
77)
at
org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:
95)
at
org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:
564)
at org.jboss.netty.channel.DefaultChannelPipeline
$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:
792)
at
org.jboss.netty.channel.SimpleChannelHandler.messageReceived(SimpleChannelHandler.java:
149)
at
com.twitter.finagle.channel.ChannelRequestStatsHandler.messageReceived(ChannelRequestStatsHandler.scala:
35)
at
org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:
95)
at
org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:
564)
at
org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:
559)
at
org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:
268)
at
org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:
255)
at
org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:94)
at
org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:
364)
at
org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:
238)
at
org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:38)
at org.jboss.netty.util.internal.DeadLockProofWorker
$1.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor
$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor
$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
Caused by: net.liftweb.json.MappingException: Did not find value which
can be converted into java.lang.String
at net.liftweb.json.Meta$.fail(Meta.scala:191)
at net.liftweb.json.Extraction$.convert(Extraction.scala:403)
at net.liftweb.json.Extraction$.build$1(Extraction.scala:314)
at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:
351)
... 74 more

how I can fix this?

anyone has any suggestions please

Thanks for your attention

Diego Medina

unread,
Jan 9, 2013, 8:25:25 PM1/9/13
to Lift
what I normally do to work with lift json is to clone

https://github.com/lift/lift_25_sbt

and go into the lift json template, which has a test template, where
you can add the JObject you get, and try different things there
(sometimes the repl does not work because lift-json does not have
everything it needs)

https://github.com/lift/lift_25_sbt/tree/master/scala_29/lift_json


if you can add your example to github (using this template), I can
then take a look and see what I can do.

Now, I looked at your example a bit more, when you use extract[T] ,
you are supposed to provide a case class that has fields for all the
values from your json, here you only provide two fields, but the json
has a lot more.

What you can do, if all you want is the name, then you can:


val postName = (response.getContent.toString("UTF-8") ) \
"name").extract[String]

For more options on extracting data, see

https://github.com/lift/framework/tree/master/core/json#linq-style

Hope that helps


Thanks

Diego

Antonio Salazar Cardozo

unread,
Jan 10, 2013, 12:18:17 PM1/10/13
to lif...@googlegroups.com
Actually I think if the JSON has more fields than your case class it's fine. I think the issue here is that the object that has the fields you're looking for isn't the top-level object, it's inside a child object. It's hard to tell at a glance because the JObject syntax is a bit intense. What does the actual JSON look like? You may want to try something like:

val json = response.getContent
val results =
  for {
    JArray(hits) <- json \ "hits"
    item <- hits
  } yield {
    item.extract[Person]
  }

That's just a quick try, so it may not work 100%, but hopefully it gives you some idea of how it would work.
Thanks,
Antonio

Sanx

unread,
Jan 22, 2013, 3:47:53 PM1/22/13
to Lift
Thank you very much for your answers Antonio and Diego

Once again I need your help

I have the following function


def search( searchTerm: String ){

var returnValue:List[SearchPosts] = Nil
val json_in= parse(""" { "query" : { "term" : { "name": """" +
searchTerm + """" }}} """)
val httpResponse = ElasticSearch.mongoindexSearch( json_in )

httpResponse.onSuccess{
response =>
val json = parse( response.getContent.toString("UTF-8") )
//println("\njson: \n\n" + json + "\n\n")
for {
JObject(child) <- json
JField("name", JString(name)) <- child
JField("description", JString(description)) <- child
} yield {
returnValue = List(SearchPosts( name , description ))
println("\ninside search: \n\n" + returnValue + "\n\n")
}
Future.Done
}.onFailure{err =>
logger.error(err)
Future.Done
}
returnValue

}


What I need is the following:

search function returns something like this:

List(SearchPosts(dos,dos))

and I have not gotten it yet

i don't know what is the best way to do this

does anyone has any suggestions please?


leave a copy of the project here:

https://github.com/hectorgool/elasticsearch_example

The script es.sh, is to index the data test(in the repository)

Thanks for your attention




On 10 ene, 11:18, Antonio Salazar Cardozo <savedfastc...@gmail.com>
wrote:
> > On Wed, Jan 9, 2013 at 8:10 PM, Sanx <hecto...@gmail.com <javascript:>>
> > org.jboss.netty.handler.codec.http.HttpChunkAggregator.messageReceived(Http ChunkAggregator.java:
>
> > > 111)
> > >         at
>
> > org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleC hannelUpstreamHandler.java:
>
> > > 75)
> > >         at
>
> > org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelP ipeline.java:
>
> > > 564)
> > >         at org.jboss.netty.channel.DefaultChannelPipeline
> > > $DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:
> > > 792)
> > >         at
> > > org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:
> > > 296)
> > >         at
>
> > org.jboss.netty.handler.codec.replay.ReplayingDecoder.unfoldAndFireMessageR eceived(ReplayingDecoder.java:
>
> > > 567)
> > >         at
>
> > org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingD ecoder.java:
>
> > > 551)
> > >         at
>
> > org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(Repla yingDecoder.java:
>
> > > 445)
> > >         at
>
> > org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleC hannelUpstreamHandler.java:
>
> > > 75)
> > >         at
>
> > org.jboss.netty.handler.codec.http.HttpClientCodec.handleUpstream(HttpClien tCodec.java:
>
> > > 92)
> > >         at
>
> > org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelP ipeline.java:
>
> > > 564)
> > >         at org.jboss.netty.channel.DefaultChannelPipeline
> > > $DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:
> > > 792)
> > >         at
>
> > org.jboss.netty.channel.SimpleChannelHandler.messageReceived(SimpleChannelH andler.java:
>
> > > 149)
> > >         at
>
> > com.twitter.finagle.channel.ChannelStatsHandler.messageReceived(ChannelStat sHandler.scala:
>
> > > 77)
> > >         at
>
> > org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHa ndler.java:
>
> > > 95)
> > >         at
>
> > org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelP ipeline.java:
>
> > > 564)
> > >         at
>
> ...
>
> leer más »

Diego Medina

unread,
Jan 22, 2013, 11:42:54 PM1/22/13
to Lift
So, here you are dealing with a different way of working.

Finagle works with Futures, it may be worth spending some time reading
their docs at
https://github.com/twitter/finagle

In short, when Finagle goes to elastic search, it will not block a
thread, so it will store the result from ES in the Future.

Now, you have two options wot deal with this.

If you are displaying your search results in a page that uses comet,
you can have

def search( searchTerm: String ): Unit {..

S.session.foreach(_.sendMessage( ... ) // this sends a comet
actor a message, with the result you want to display on the UI


Future.Done
}.onFailure{err =>
...
.}


the other options, if you are using snippets, is to just block on the Future.

so, def search( ...): Future[MyCaseClass]


val result = search(paramHere)

def render = {

"#result *" #> result.get.map( ...)
}


Some people may say this is horrible, oh no, how could you block on
io, etc. The way I see is, when I do a search, as a user I want to see
the results right away, getting to a landing page with a spinning
icon, and then seeing the result of the search does not give me a
"better experience", if the search takes a long time, enough to worry
about blocking thousands of threads, then you need to optimize your
search so you get faster results. But we may be diverting from your
question here :)


Anyway, there are a few other ways, but those should give you a pretty
good idea of what to do.

So, you cannot assign a var the result from the Future from inside the
onSuccess callback, it does not work as you expected it to.

Hope that helps.

Diego
> --
> --
> Lift, the simply functional web framework: http://liftweb.net
> Code: http://github.com/lift
> Discussion: http://groups.google.com/group/liftweb
> Stuck? Help us help you: https://www.assembla.com/wiki/show/liftweb/Posting_example_code
>
>
>



--
Diego Medina
Lift/Scala Developer
di...@fmpwizard.com
http://fmpwizard.telegr.am

Sanx

unread,
Jan 25, 2013, 11:24:10 AM1/25/13
to Lift

Thank you very much for your help

The first option was very useful


On 22 ene, 22:42, Diego Medina <di...@fmpwizard.com> wrote:
> So, here you are dealing with a different way of working.
>
> Finagle works with Futures, it may be worth spending some time reading
> their docs athttps://github.com/twitter/finagle
> >     val httpResponse =ElasticSearch.mongoindexSearch( json_in )
> >> > >         at com.twitter.util.Promise$$anonfun$respondWithoutChaining...
>
> leer más »
Reply all
Reply to author
Forward
0 new messages