2015-12-21 100 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