当客户端的处理量太大时,ElasticSearch 中的 map-reduce 相当于什么?是否有类似“流”之类的东西,以便客户端可以在输入数据时减少输出?
假设我需要在客户端进行连接或复杂的过滤,如果没有某种映射缩减方案,这种类型可能不适合内存。我不介意等待很长时间才能得到响应,但我不想破坏机器(客户端和/或服务器)。
我该怎么办?
示例,映射:
{"book":{"properties":{
"title":{"type":"string", "index":"analyzed"},
"author":{"type":"string", "index":"analyzed"},
}
{"character":{"properties":{
"book_id":{"type":"string", "index":"not_analyzed"},
"name":{"type":"string", "index":"analyzed"},
"age":{"type":"integer"},
"catch-phrase":{"type":"string", "index":"analyzed"},
}
Run Code Online (Sandbox Code Playgroud)
假设我想找到所有至少有 M 个字符且口号不超过 N 的书籍(其中 N 是客户端提供的参数)
所以它会是get_books_with_short_phrases(M,N)
我当然可以将“短语长度”等字段添加到“字符”类型中,但我们假设“流行语”的处理可能一直在变化。
我想将“字符”和“书籍”流式传输到客户端,检查每个客户端并输出一个键值,<book>-<character,len(phrase)>然后将其进一步减少到<book>-<num_of_chars_with_short_phrase>
如果我将所有文档加载到客户端内存中,那可能是一场灾难。如果客户处理每本书并将其简化为 ak,v 可能会更好。
我是不是搞错了?
该解决方案是否以某种方式在服务器上运行脚本,以便执行映射缩减?
据我所知,你不能使用 ES 进行流式传输。
我确信您知道最好进入一种不存在“连接”的不同心态。相反,反规范化并尝试通过 1 个 ES 查询来覆盖您的用例,当然这并不总是有效。
然而,在上述情况下,我邀请您看一下脚本过滤器,它允许复杂的计算(类似于 sql 存储过程),并允许查询时参数。
我非常有信心这应该为您提供在服务器上执行查询的工具,尽管我只是没有深入研究它。
http://www.elastic.co/guide/reference/query-dsl/script-filter/ http://www.elastic.co/guide/reference/modules/scripting/
| 归档时间: |
|
| 查看次数: |
13204 次 |
| 最近记录: |