Elasticsearch--扩展索引结构

索引树形数据

使用path_analyzer分析树形数据字段

索引非扁平数据

数据如下:

{
    "book":{
        "author":{
            "name":{
                "firstName":"Fyodor",
                "lastName":"Dost"
            }
        },
        "title":"Crime and Punishment",
        "year":1886,
        "characters":[
            {
                "name":"Raskolnikow"
            },
            {
                "name":"Sofia"
            }
        ]
    }
}

注意到characters是个数组类型,author是json类型
那么该索引的映射定义:

{
    "book":{
        "properties":{
            "author":{
                "type":"object",
                "properities":{
                    "name":{
                        "type":"object",
                        "properties":{
                            "firstName":{
                                "type":"string"
                            },
                            "lastName":{
                                "type":"string"
                            }
                        }
                    }
                }
            },
            "title":{
                "type":"string"
            },
            "year":{
                "type":"integer"
            },
            "characters":{
                "properties":{
                    "name":{
                        "type":"string"
                    }
                }
            }
        }
    }
}

Elasticsearch是无模式的,不必在创建映射就可以索引数据。Elasticsearch的动态行为默认是打开的,可为字段的定义添加“dynamic”属性,属性值设为false,或者在elasticsearch.yml配置文件中加入index.mapper.dynamic=false

索引关系型数据

使用嵌套对象

某些情况下使用嵌套文档更加方便,基本上,通过使用嵌套对象,Elasticsearch允许我们连接一个主文档和多个附属文档,主文档和嵌套文档一起被索引。但是,更新嵌套文档时,必须同时索引父文档和其他所有嵌套文档

嵌套对象的定义的时候字段类型为nested,定义方式可以参考Object类型。

对嵌套文档的查询DSL如下:

{
    "query":{
        "nested":{
            "path":[
                "fileds"
            ]
        },
        "query":{

        }
    }
}

nested指定查询嵌套文档。path属性指定了嵌套对象的名称(可以是多个)。nested中的query部分是一个标准的查询,嵌套对象的字段名称应该是完整的路径。

当然,还可以使用嵌套过滤器

评分与嵌套查询

除了path属性外,还有一个score_mode属性可以设置,即嵌套查询的得分和最外层query查询得分的组合方式。取值有:avg(默认),total,max,none

使用主从关系

ElasticSearch 中的Parent-Child关系和nested模型是相似的, 两个都可以用于复杂的数据结构中,区别是 nested 类型的文档是把所有的实体聚合到一个文档中而Parent-Child现对于比较独立,每个实体即为一个文档
Parent-Child 优点
1、父文档更新时不用重新为子文档建立索引
2、子文档的增加、修改、删除是对父文档和其他子文档没有任何影响的,这非常适用于子文档非常大并且跟新频繁的场景
3、子文档也可以查询结果返回
ElasticSearch 内部维护一个map来保存Parent-Child之间的关系,正是由于这个map,所以关联查询能够做到响应速度很快,但是确实有个限制是Parent 文档和所有的Child 文档都必须保存到同一个shard中
ElasticSearch parent-child ID的映射是存到Doc value 中的,有足够的内存时响 应是很快的。当这个map很大的时候,还是有要有一部分存储在硬盘中的。

旧版本主从关系在新版本发生了变化。
https://www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html

原文地址:https://www.cnblogs.com/51zone/p/9841003.html