2013-05-14 46 views
0

假設我在索引中有一些文檔。其中一個字段是網址。類似...對部分字符串進行排版

{"Url": "Server1/Some/Path/A.doc"}, 
{"Url": "Server1/Some/OtherPath/B.doc"}, 
{"Url": "Server1/Some/C.doc"}, 
{"Url": "Server2/A.doc"}, 
{"Url": "Server2/Some/Path/B.doc"} 

我試圖通過路徑爲我的搜索結果提取計數。這大概是每個分支的查詢。

如:

Initial query: 
    Server1: 3 
    Server2: 2 

Server1 Query: 
    Some: 3 

Server1/Some Query: 
    Path: 1 
    OtherPath: 1 

現在我可以看到廣泛2周的方式接近這一點,我不是任忠實球迷。

選項1:腳本。米爾似乎只限於數學運算(至少我無法在文檔中找到字符串拆分),所以這將不得不在Java中。這是可能的,但如果有很多記錄,則感覺會有很多開銷。

選項2:存儲的路徑部分文檔一起...

{"Url": ..., "Parts": ["1|Server1","2|Some","3|Path"]}, 
{"Url": ..., "Parts": ["1|Server1","2|Some","3|OtherPath"]}, 
{"Url": ..., "Parts": ["1|Server1","2|Some"]}, 
{"Url": ..., "Parts": ["1|Server2"]}, 
{"Url": ..., "Parts": ["1|Server2","2|Some","3|Path"]} 

這樣我可以做類似。 Urls starting with 'Server1/Some', facet on parts starting with 3|。這感覺非常可怕。

這樣做的好方法是什麼?我可以根據需要進行儘可能多的預處理,但需要來自ES的計數,因爲這是重要的查詢結果的計數。

回答

0

考慮到與URL中的文檔/a/b/c

多值url 和輸入(使用預處理)值:/a/a/b/a/b/c

編輯

當你想禁忌顯示計數到一定深度的路徑,您可以按照描述設計多個多值字段以上。每個領域將代表一個特定的深度。

ES客戶端應該包含邏輯來決定查詢facet的深度(以及哪個字段)。

儘管如此,仍然感覺像一個黑客攻擊,事實上沒有數據控制,你可能會得到很多這樣的領域。

+0

這很好,但如果我想得到(說)每臺服務器的計數器沒有辦法做到這一點,因爲我不知道我需要哪些多值 - 只能轉儲_entire_索引 - 有效地構建整個樹在一個走。因此,我在我的'Parts'建議中加入了一個計數器 – Basic 2013-05-14 16:00:15

+0

不要以爲你需要預處理,只需使用[path hierarchy tokenizer](http://www.elasticsearch.org/guide/reference/index-modules/analysis)/pathhierarchy-tokenizer /),它以索引標記的形式給出了相同的結果。 – javanna 2013-05-14 18:36:17

+1

@基本不知道爲什麼這不好。您是否想要獲得第二個級別,不僅適用於特定服務器,還適用於所有服務器?也許看看[這裏](http://www.springyweb.com/2012/01/hierarchical-faceting-with-elastic.html)。 – javanna 2013-05-14 18:38:14

相關問題