当客户端的处理过多时,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?
答案 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实现。