Elasticsearch等同于Map-Reduce

时间:2013-05-09 20:48:09

标签: elasticsearch

当客户端的处理过多时,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>

如果我将所有文档加载到客户端内存中,那可能会造成灾难。如果客户端处理每本书并将其减少到k,那么它可能会更好。

我错了吗?

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

2 个答案:

答案 0 :(得分:3)

afaik你不能用ES做流媒体。

我确信你知道最好进入一种不同的心态,其中'加入'不存在。相反,非规范化并尝试用ES查询来覆盖您的用例,当然这并不总是有效。

在上面的例子中,我邀请你看看脚本过滤器,它允许允许查询时参数的复杂计算(类似于sql存储过程)。

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

http://www.elasticsearch.org/guide/reference/query-dsl/script-filter/ http://www.elasticsearch.org/guide/reference/modules/scripting/

答案 1 :(得分:0)

是的,数据应该可以非规范化,因此您可以在一个文档中包含所有内容。

然后我会看一下scripted metrics,它允许您使用查询中的groovy脚本或本机Java脚本来执行映射/缩减,就像Elasticsearch节点本身的分布式处理一样,只返回结果值。参见例如this example用于示例Java实现。