Elasticsearch等同于Map-Reduce

问题描述 投票:3回答:2

当处理对于客户端来说太多时,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)

我当然可以将诸如“ phrase-length”的字段添加到“ character”类型,但是让我们假设对“ catch-phrase”的处理可能一直在变化。

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

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

我错了吗?

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

elasticsearch
2个回答
4
投票

afaik,您无法使用ES进行流式传输。

[我确定您知道最好进入一种不存在'joins'的不同心态。取而代之的是进行非规范化,并尝试对ES进行1次查询来覆盖用例,但这并不总是可行的。

但是,在上述情况下,我邀请您看一下脚本过滤器,该过滤器允许进行复杂的计算(类似于sql存储过程),该计算允许使用查询时参数。

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.