zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    form标签
    roadmap
    自我介绍
    3 week work—Grid Layout
    3 week work—Position
    2nd week
    objects
    个人简介
    7th week :DOM BOM
    颜色表示法
  • 原文地址:https://www.cnblogs.com/51zone/p/9841003.html
Copyright © 2011-2022 走看看