qingmoucsdn 2019-06-28
在像Elasticsearch这样的分布式系统中执行完全sql风格的join代价非常高,相反,Elasticsearch提供了两种旨在横向伸缩的join形式。
nested
查询文档可能包含嵌套类型的字段,这些字段用于索引对象数组,其中每个对象都可以作为独立文档查询(使用nested
查询)。
has_child
和has_parent
查询在单个索引中的文档之间可以存在联接字段关系,has_child
查询返回子文档与指定查询匹配的父文档,而has_parent
查询返回父文档与指定查询匹配的子文档。
还可以在terms
查询中查看terms查找机制,它允许你从另一个文档中包含的值构建术语查询。
嵌套查询允许查询嵌套对象/文档(参见嵌套映射),对嵌套的对象/文档执行查询,就好像它们被索引为独立的文档(在内部)一样,并且结果是根父文档(或父嵌套映射),下面是我们将使用的示例映射:
PUT /my_index { "mappings": { "type1" : { "properties" : { "obj1" : { "type" : "nested" } } } } }
下面是一个嵌套查询用法示例:
GET /_search { "query": { "nested" : { "path" : "obj1", "score_mode" : "avg", "query" : { "bool" : { "must" : [ { "match" : {"obj1.name" : "blue"} }, { "range" : {"obj1.count" : {"gt" : 5}} } ] } } } } }
查询path
指向嵌套的对象路径,query
包括将在嵌套文档上运行的与直接路径匹配的查询,并与根父文档连接,注意,查询中引用的任何字段都必须使用完整路径(完全限定)。
score_mode
允许设置内部子匹配如何影响父得分,它默认为avg
,但可以是sum
、min
、max
和none
。
还有一个ignore_unmapped
选项,当设置为true
时,它会忽略一个未映射的path
,并且不会匹配这个查询的任何文档,这在查询可能具有不同映射的多个索引时非常有用。当设置为false
(默认值)时,如果path
没有映射,查询将抛出异常。
自动支持和检测多级嵌套,结果是生成一个内部嵌套查询,如果它存在于另一个嵌套查询中,则自动匹配相关的嵌套级别(而不是根)。
has_child
过滤器接受要运行的查询和子类型,并生成子文档与查询匹配的父文档,这里有一个例子:
GET /_search { "query": { "has_child" : { "type" : "blog_tag", "query" : { "term" : { "tag" : "something" } } } } }
另外一部分,则需要先做聚类、分类处理,将聚合出的分类结果存入ES集群的聚类索引中。数据处理层的聚合结果存入ES中的指定索引,同时将每个聚合主题相关的数据存入每个document下面的某个field下。