面对一部分字符串

时间:2013-05-14 11:25:09

标签: elasticsearch faceted-search facet

假设我在索引中有一些文档。其中一个字段是网址。有点像...

{"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

现在我可以广泛地看到两种方法来解决这个问题,而且我也不是他们的忠实粉丝。

选项1:脚本。 mvel似乎仅限于数学运算(至少我在文档中找不到字符串拆分)所以这必须是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,因为它是重要查询的结果计数。

1 个答案:

答案 0 :(得分:0)

给定带有网址/a/b/c

的文档

拥有多值字段url 并输入(使用预处理)值:/a/a/b/a/b/c

修改

当您想要将显示计数限制在某个深度的路径时,您可以设计多个多值字段,如上所述。每个字段代表一个特定的深度。

ES客户端应该包含逻辑来决定查询构面的深度(以及哪个字段)。

虽然仍然感觉像是一个黑客,但实际上没有数据控制,你最终可能会有很多字段。