2014-01-21 21 views
1
獲取實體

想象一下,我們有這個簡單的實體ES其父實體的價值Elasticsearch

user { 
username: "ultrauser" 
name: "Greg" 
address: [ 
    { city: "London" }, {city: "Prague" } 
] 
} 

我需要一個查詢,這將返回我的所有addreses用戶「ultrauser」。

我正在使用NEST,現在我按照我選擇用戶的方式輸入用戶名=「ultrauser」,然後自己只讀取地址字段。所以ES將返回給我整個用戶實體,其中也包含地址。

但ES有可能讓查詢像「給我所有地址,屬於用戶'超級用戶'」?

我需要ES返回地址實體列表,而不是包含地址的用戶實體。從根到葉(獲取user.address.city)很簡單,但我怎樣才能輕鬆地從樹葉選擇根?

重要的是,由於其他原因,我們不能使用父子或嵌套文檔功能。

感謝您的所有想法。

回答

1

您應該閱讀這篇文章:http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/您試圖將RDBMS概念應用於elasticsearch,這通常是一個壞主意。實際上,即使您正在存儲對象,它們仍然在後臺彈性搜索中保存爲平面。

我覺得這個查詢會得到你,你想不過,如果我理解正確你:

如果你提取的地址或者,如果你問elasticsearch做
{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "term": { 
         "username": "some matched item" 
        } 
       }, 
       { 
        "filtered": { 
         "filter": { 
          "exists": { "field" : "address" } 
         } 
        } 
       } 
      ] 
     } 
    }, 
    "fields": [ 
     "address" 
    ] 
} 

不要緊爲你?有時候如果不需要,你不想通過網絡發送所有的數據,這可能是你的理由。

這仍然會回到這樣的事情:

hits: [ 
{ 
_index: indexname 
_type: typename 
_id: id 
_score: 1.4142135 
fields: { 
address: [ 
{someaddress_object} 
] 
} 
}, ... 

所以你仍然需要遍歷結果無論如何,當你得到他們回來,而造成的尺寸更小。

+0

是的,我需要它變小。我創建了這個簡單的示例,因爲用戶包含更多的字段,並且當我只需要一個字段時,獲取整個用戶是沒有意義的。我會嘗試你的建議並讓你知道(並標記答案)。但是這可能需要一些時間,因爲我使用通用NEST,所以我必須重寫查詢。謝謝 –

+0

只有一個問題 - 爲什麼我應該使用過濾器呢?如果我想要一個特定的地址,屬於用戶「超級用戶」,那麼我可以輕鬆地爲用戶進行查詢,在字段「地址」上設置過濾器,然後說我只希望返回字段「地址」。但它將包含所有用戶的地址,我必須再次應用過濾器(使用linq或其他)。我只會知道,所需的地址是結果中的某個地方。 –

+0

@MartinPotvrzenejBrabec你真的不是。我只是展示了一個稍微複雜的例子,如果你正在尋找多個用戶,你想過濾掉那些沒有地址的用戶。或者讓我們假設你正在查詢其他一些值(比如向我展示某個城市的所有地址或其他值)。這個答案的重要部分是最後的「字段」節 –