2015-12-21 111 views
1

我正在尝试使用Elastic4s创建过滤器查询。我已经有了这么多,但我似乎无法找到任何示例,所以我不确定这是如何工作的。所以我得到了:使用Elastic4s进行过滤器查询

val percQuery = percolate in esIndex/esType query myQuery 

esClient.execute(percQuery) 

它每次运行它都不匹配任何东西。我发现我需要能够渗透到一个Id上,但我似乎无法找到任何有关如何去做的例子,甚至在文档中也没有。我知道有Elastic4s创建以外渗滤查询,您可以指定喜欢的ID字段的查询:

val query = index into esIndex/esType source myDoc id 12345 

我试过这样的渗滤液,但它不喜欢的ID字段,没有人知道如何能做完了?

我以前使用Dispatch Http来做这件事,但我试图摆脱它。之前,我是这样做的提交percolator查询:

url(s"$esUrl/.percolator/$queryId) 
    .setContentType("application/json", "utf-8") 
    .setBody(someJson) 
    .POST 

注意queryId只是需要类似的东西,但在elastic4s。

回答

0

所以你想添加一个文件,并返回正在等待那个id被添加的查询?这似乎是一个奇怪的用途,因为它只是一次性使用,因为每个ID只能添加一个文档。你不能在elastic4s上做一个percolate目前的id,我不确定你是否可以在elasticsearch本身做。

这是我能想出的最好的尝试,你有自己的“id”字段,它可以反映'正确的'_id字段。

object Test extends App { 

    import ElasticDsl._ 
    val client = ElasticClient.local 

    client.execute { 
    create index "perc" mappings { 
     "idtest" as(
     "id" typed StringType 
     ) 
    } 
    }.await 

    client.execute { 
    register id "a" into "perc" query { 
     termQuery("id", "a") 
    } 
    }.await 

    client.execute { 
    register id "b" into "perc" query { 
     termQuery("id", "b") 
    } 
    }.await 

    val resp1 = client.execute { 
    percolate in "perc/idtest" doc("id" -> "a") 
    }.await 

    // prints a 
    println(resp1.getMatches.head.getId) 

    val resp2 = client.execute { 
    percolate in "perc/idtest" doc("id" -> "b") 
    }.await 

    // prints b 
    println(resp2.getMatches.head.getId) 
} 

书面使用elastic4s 1.7.4

+0

那么我以前使用调度Http来做到这一点,但我试图摆脱它。之前,我正在做这个提交percolator查询:'url(s“$ esUrl/.percolator/$ queryId)'注意queryId只是需要类似的东西。你认为这仍然是最好的方法吗? –

0

所以经过更多研究我想通了,它的运作方式elastic4s。要在Elastic4s做到这一点你确实有使用,而不是寄存器渗透像这样:

val percQuery = register id queryId into esIndex query myQuery 

这将注册在ID渗滤查询。

+0

Register is注册查询的行为Percolate是添加文档并查看它匹配的注册查询的行为我认为术语与Elasticsearch一致, – monkjack