4

当客户端的处理过多时,ElasticSearch 中的 map-reduce 等价物是什么?是否有类似“流式传输”的东西,以便客户端可以在数据进入时将数据减少到输出?

假设我需要在客户端进行连接或复杂过滤,如果没有一些 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"},
}

假设我想找到所有至少有 M 个字符且流行语不超过 N 的书籍(其中 N 是客户端提供的参数)

所以它会是get_books_with_short_phrases(M,N)

我当然可以将诸如“短语长度”之类的字段添加到“字符”类型,但让我们假设“catch-phrase”的处理可能一直在变化。

我想将“字符”和“书籍”流式传输到客户端,检查每个客户端并输出一个键值,<book>-<character,len(phrase)>然后将其进一步减少到<book>-<num_of_chars_with_short_phrase>

如果我将所有文档都加载到客户端内存中,那可能是一场灾难。如果客户处理每本书并将其减少到 ak,v 可能会更好。

我错了吗?

解决方案是否以某种方式在服务器上运行脚本,因此它执行 map-reduce?

4

2 回答 2

4

afaik 你不能用 ES 做流媒体。

我相信你知道最好进入不存在“加入”的不同心态。取而代之的是非规范化并尝试使用 1 个对 ES 的查询来覆盖您的用例,当然这并不总是有效。

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

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

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

于 2013-05-11T21:12:37.177 回答
0

是的,数据可能应该被非规范化,以便您将所有内容都放在一个文档中。

然后我会查看脚本指标,它允许您使用查询中的 groovy 脚本或本机 Java 脚本在 Elasticsearch 节点本身上执行 map/reduce 之类的分布式处理,您只返回生成的缩减值。有关示例 Java 实现,请参见此示例。

于 2015-10-07T12:30:55.877 回答