Elasticsearch 相当于 Map-Reduce

era*_*ran 5 elasticsearch

当客户端的处理量太大时,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 可能会更好。

我是不是搞错了?

该解决方案是否以某种方式在服务器上运行脚本,以便执行映射缩减?

Gee*_*Jan 5

据我所知,你不能使用 ES 进行流式传输。

我确信您知道最好进入一种不存在“连接”的不同心态。相反,反规范化并尝试通过 1 个 ES 查询来覆盖您的用例,当然这并不总是有效。

然而,在上述情况下,我邀请您看一下脚本过滤器,它允许复杂的计算(类似于 sql 存储过程),并允许查询时参数。

我非常有信心这应该为您提供在服务器上执行查询的工具,尽管我只是没有深入研究它。

http://www.elastic.co/guide/reference/query-dsl/script-filter/ http://www.elastic.co/guide/reference/modules/scripting/