2016-09-29 46 views
0

內搜索我有物體在ElasticSearch以下結構:ElasticSearch:如何收集

{ 
    _id: 1, 
    myObj: { 
    myCol: [{id: 1, name:"1"}, {id: 2, name:"2"}, {id: 3, name:"3"}] 
    } 
}, 
{ 
    _id: 2, 
    myObj: { 
    myCol: [{id: 2, name:"2"}, {id: 3, name:"3"}, {id: 4, name:"4"}] 
    } 
}, 

我使用C#NEST庫創建查詢。我想使用標識符集合搜索myCol對象集合。

實施例#1: 搜索請求:標識符[2,3] 結果:兩個對象返回

實施例#2: 搜索請求:標識:[1] 結果:首先對象返回

實例#3: 搜索請求:標識:[1,2,3,4] 結果:否對象返回


什麼,我actullay試圖做的是一個查詢「包含所有」。

請注意:

  1. C#NEST MultiMatchQuery類型不支持整型數組(僅字符串那麼糟糕。)。所以請不要讓我使用這種類型的查詢
  2. 我正在使用對象初始化程序查詢語法
  3. ElasticSearch語法中的正確查詢就足夠了。
+0

如果我理解你的權利,你不應該需要什麼特殊的位置 - 只是一個布爾查詢與'myObj.myCol.id'多'Must'條款 - 集合在Lucene的扁平化了所以你真正擁有的是有效的重複鍵,以便'myObj.myCol.id = 1 && myObj.myCol.id = 2 ...' –

+0

您可以創建此查詢在彈性的例子嗎? –

回答

2

你想要的是獲取包含集合中某個地方的所有指定ID的文檔。

當您在ElasticSearch中使用對象集合時,它們會變平,所以實際上索引類似於以下內容。

myObj.myCol.id = [ 2, 3, 4 ] 
myObj.myCol.name = [ "2", "3", "4" ] 

在許多情況下,因爲你失去的軌道,其中對ID /名稱的一起去,這是有問題的(所以你不能,例如,查詢包含對象ID爲x和名稱y文件 - 如果集合包含xy不同對象)就會產生誤報。

然而,在你的情況,它實際上是有益的,因爲你可以查詢包含在myObj.myCol.id所有ID文件,如:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { "match": { "myObj.myCol.id": 1 }}, 
     { "match": { "myObj.myCol.id": 2 }} 
     ] 
    } 
    } 
} 

這隻會返回其中myObj.myCol包含標識對象的文檔雙方對收藏在ES是如何工作的1和2

更多信息,可以發現here

+0

不幸的是,這不起作用。查詢成功執行,並指定一個標識符。但是,當我添加另一個 - 沒有結果返回 –

+0

@IlyaSchukin奇怪 - 如果我索引您發佈的文檔並使用此查詢,它按預期工作。可能有一些你沒有發佈的細節會影響查詢結果嗎?也許嘗試將其重新回到本次問答中的實際內容,並從那裏建立備份。 –

+0

你說得對。非常接近強硬。我不得不創建一些「嵌套」的查詢,但在他們每個裏面的布爾查詢 –