2013-05-14 121 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