ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

elasticsearch 常见的概念

2021-08-02 14:30:47  阅读:148  来源: 互联网

标签:索引 常见 shard 查询 概念 elasticsearch 分片 Master 节点


搜索
    搜索是什么
    Lucene
        特点
            单点,可用性低
            扩展性差,需要自己维护集群和负载

基本定义
    基于Lucene的分布式的Restful风格的搜索、存储和分析引擎

特点
    分布式:节点对等
    高性能:近实时(NTR)搜索,支持处理PB级数据
    高可用:容错性高
    可伸缩:支持横向和纵向扩展
    易维护:开箱即用,文档全面

优势
    面向开发者友好:屏蔽了Lucene的复杂特性
    cluster discovery:集群自动发现
    自动维护数据在多个节点上的建立
    会帮助我们做请求的负载均衡
    自动维护冗余副本,保证了部分节点宕机的情况下仍然不会有有数据的任何丢失
    ES基于Lucene提供了很多高级的功能:复合查询、聚合分析、基于地理位置搜索等
    对于大公司而言,可以构建几百台服务器的大型分布式架构,处理PB级别数据;对于小公司,开箱即用,门槛低上手简单。
    相比传统数据库,提供了全文检索、同义词处理、相关度排名,聚合分析以及海量数据的近实时处理

应用领域
    搜索引擎(全文检索、高亮、搜索推荐等)
    用户行为日志(用户点击消费、浏览收藏、点赞评论等)
    BI系统,数据分析
    GItHub
    ELK

核心概念
    倒排索引
        数据结构
            包含当前关键词的documentlist
            关键词在每个document中出现的次数,即tern frequency(TF),TF越高,则匹配相关度越高
            关键词在整个索引中出现的次数  inverse document frequency(IDF),IDF越高,则匹配相关度越低
            关键词在当前document中出现的次数
            每个doc的长度,越长相关度越低
            包含这个关键词的所有doc的平均长度
    正排索引
        es官方是建议,es大量是基于os cache来进行缓存和提升性能的,不建议用jvm内存来进行缓存,那样会导致一定的gc开销和oom问题,给jvm更少的内存,给os cache更大的内存。比如64g服务器,给jvm最多4~16g(1/16~1/4),os cache可以提升doc value和倒排索引的缓存和查询效率
    cluster:集群
    node:节点
        (一个节点≠一台服务器主机)
    field:数据字段
    document:文档
        ES的最小数据单元,Json格式
    type:类型
        逻辑分类,ES 7.x取消了type的概念
    index:索引    
        相同或者类似的document的集合
    shard:分片
        两种分片类型
            primary shard:主分片
                再创建索引的时候,除非手动配置了primary shard的数量,否则es默认配置为5个primary,如果需要修改索引的primary的数量,需要重建索引
            replica shard:副本分片
                es默认为每个primary shard分配一个replica shard,replica shard数量可动态修改
        特点
            每一个shard都是一个Lucene实例,具有完整的创建索引和处理搜索请求的能力
            es会自动为我们做shard均衡
            一个dicument不可能同时存在于多个primary shard中,但是可以同时存在于多个replica shard中
            primary shard不能和他的replica shard存在于同一个节点,这不符合高可用的规范,因为一旦节点宕机,主副分片同时丢失,所以最小的可用配置是两个节点,互为主备

ES分布式原理
    高可用
        ES在分配单个索引的分片时会将每个分片尽可能分配到更多的节点上。但是,实际情况取决于集群拥有的分片和索引的数量以及它们的大小,所以这种情况只是理想状况。
        ES不允许Primary和它的Replica放在同一个节点中(为了容错),并且同一个节点不接受完全相同的两个Replica,也就是说,因为同一个节点存放两个相同的副本既不能提升吞吐量,也不能提升查询速度,徒耗磁盘空间。
        每台节点的shard数量越少,每个shard分配的CPU、内存和IO资源越多,单个shard的性能越好,当一台机器一个Shard时,单个Shard性能最好。
        (4)相同资源分配相同的前提下,单个shard的体积越大,查询性能越低,速度越慢
        稳定的Master节点对于群集健康非常重要!理论上讲,应该尽可能的减轻Master节点的压力,分片数量越多,Master节点维护管理shard的任务越重,并且节点可能就要承担更多的数据转发任务,可增加“仅协调”节点来缓解Master节点和Data节点的压力,但是在集群中添加过多的仅协调节点会增加整个集群的负担,因为选择的主节点必须等待每个节点的集群状态更新确认。
        如果相同资源分配相同的前提下,shard数量越少,单个shard的体积越大,查询性能越低,速度越慢,这个取舍应根据实际集群状况和结合应用场景等因素综合考虑
        数据节点和Master节点一定要分开,集群规模越大,这样做的意义也就越大
        数据节点处理与数据相关的操作,例如CRUD,搜索和聚合。这些操作是I / O,内存和CPU密集型的,所以他们需要更高配置的服务器以及更高的带宽,并且集群的性能冗余非常重要
        于仅投票节不参与Master竞选,所以和真正的Master节点相比,它需要的内存和CPU较少。但是,所有候选节点以及仅投票节点都可能是数据节点,所以他们都需要快速稳定低延迟的网络
        高可用性(HA)群集至少需要三个主节点,其中至少两个不是仅投票节点。即使其中一个节点发生故障,这样的群集也将能够选举一个主节点。生产环境最好设置3台仅Master候选节点(node.master = true     node.data = true)
        为确保群集仍然可用,集群不能同时停止投票配置中的一半或更多节点。只要有一半以上的投票节点可用,群集仍可以正常工作。这意味着,如果存在三个或四个主节点合格的节点,则群集可以容忍其中一个节点不可用。如果有两个或更少的主机资格节点,则它们必须都保持可用
    容灾
        第一步:Master选举
            脑裂:可能会产生多个Master节点
            解决:discovery.zen.minimum_master_nodes=N/2+1
        第二步:Replica容错
        第三步:尝试重启故障机
        第四步:数据同步

语法
    CRUD
        创建索引:PUT /索引名称?pretty
        查询索引:GET _cat/indices?v
        删除索引:DELETE /msb_index?pretty
        插入数据:
        更新数据
            全量更新:使用PUT关键字,和插入数据格式相同,会完整替换原始数据
            更新字段
        查询数据
            GET /product/_doc/_search    查询所有
            GET /product/_doc/1    根据id查询
    查询
        Searchtimeout
            默认没有timeout,如果设置了timeout,那么会执行timeout机制
            Timeout机制:假设用户查询结果有1W条数据,但是需要10″才能查询完毕,但是用户设置了1″的timeout,那么不管当前一共查询到了多少数据,都会在1″后ES讲停止查询,并返回当前数据。
            用法:GET /_search?timeout=1s/ms/m
        Query_string
            ①查询所有:GET /product/_search
            ②带参数:GET /product/_search?q=name:xiaomi
            ③分页:GET /product/_search?from=0&size=2&sort=price:asc
        Query DSL
            ①match_all:匹配所有
            ②match:name中包含“nfc”
            ③sort:按照价格倒序排序
            multi_match:根据多个字段查询一个关键词,name和desc中包含“nfc”的doc
            _source 元数据:想要查询多个字段,例子中为只查询“name”和“price”字段。
            ⑥分页(deep-paging):查询第一页(每页两条数据)
        Phrase search:短语搜索,和全文检索相反,“nfc phone”会作为一个短语去检索
        Full-text queries:全文检索
            query-term:不会被分词
            ②match和term区别:
            ③☆全文检索:
        Query and filter:查询和过滤
            bool:可以组合多个查询条件,bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值。
                must:必须满足
                filter:过滤器 不计算相关度分数,cache☆
                3)should:可能满足 or
                must_not:必须不满足 不计算相关度分数   not
                5)minimum_should_match
            案例
                #首先筛选name包含“xiaomi phone”并且价格大于1999的数据(不排序),
#然后搜索name包含“xiaomi”and desc 包含“shouji”
                2)bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,价钱要大于等于4999
            嵌套查询:
                minimum_should_match例子
        Compound queries:组合查询
            ①想要一台带NFC功能的 或者 小米的手机 但是不要耳机
            搜索一台xiaomi nfc phone或者一台满足 是一台手机 并且 价格小于等于2999
        Highlight search:高亮
        Deep paging问题
            (1)解释:当你的数据超过1W,不要使用
            (2)返回结果不要超过1000个,500以下为宜
            (3)解决办法:
                ①尽量避免深度分页查询
                ②使用Scroll search(只能下一页,没办法上一页,不适合实时查询)
        Scroll search
    mapping
        查看mapping:GET /product/_mapping
        Dynamic mapping
        精准匹配和全文检索
            exact value 精确匹配:在倒排索引过程中,分词器会将field作为一个整体创建到索引中,
            full text全文检索:分词、近义词同义词、混淆词、大小写、词性、过滤、时态转换等(normaliztion)
        数据类型
            核心类型
                数字
                    long
                    integer
                    short
                    byte
                    double
                    float
                    half_float
                    scaled_float
                日期
                    date
                    date_nanos
                字符串
                    keyword
                    text
                binary(二进制)
                range(区间类型)
                    integer_range
                    float_range
                    long_range
                    double_range
                    date_range
            复杂类型
                Object:用于单个JSON对象
                Nested:用于JSON对象数组
            地理位置
                Geo-shape:用于多边形等复杂形状
                Geo-shape:用于多边形等复杂形状
            特有类型
                IP地址:ip 用于IPv4和IPv6地址
                Completion:提供自动完成建议
                Tocken_count:计算字符串中令牌的数量
                Murmur3:在索引时计算值的哈希并将其存储在索引中
                Annotated-text:索引包含特殊标记的文本(通常用于标识命名实体
                Percolator:接受来自query-dsl的查询
                Join:为同一索引内的文档定义父/子关系
                Rank features:记录数字功能以提高查询时的点击率。
                Dense vector:记录浮点值的密集向量。
                Sparse vector:记录浮点值的稀疏向量。
                Search-as-you-type:针对查询优化的文本字段,以实现按需输入的完成
                Alias:为现有字段定义别名。
                Flattened:允许将整个JSON对象索引为单个字段。
                Shape:shape 对于任意笛卡尔几何
                Histogram:histogram 用于百分位数聚合的预聚合数值。
                Constant keyword:keyword当所有文档都具有相同值时的情况的 专业化
            Constant keyword
                keyword当所有文档都具有相同值时的情况的 专业化
            ES 7新增:
                Date_nanos:date plus 纳秒
                Features:
                Vector:as
        Mapping parameters 
            index
            analyzer
            boost
            coerce
            copy_to
            doc_values
            dynamic
            eager_global_ordinals
            enable
            fielddata
            fields
            format
            ignore_above
            ignore_malformed
            index_options
            Index_phrases
            Index_prefixes
            meta
            normalizer
            norms
            null_value
            position_increment_gap
            proterties
            search_analyzer
            similarity
            store
            term_vector
    聚合查询
        聚合类型
            terms
            aggs
    批量查询:_mget
        语法
            GET /_mget
            GET /<index>/_mget    
    批量增删改:_bulk
        语法
            POST /_bulk
            
POST /<index>/_bulk
        支持的操作类型  Operate
            create
                PUT /index/_create/id/    强制创建
            delete
                删除(lazy delete原理)
            index
                可以是创建,也可以是全量替换
            update
                执行partial update(全量替换,部分替换)
    Scripting
        painless
            支持操作:delete、upsert、noop
            参数化查询
            Stored scripts
        expression
        mustache
        java

分词
    作用
        切词
        ②normalization(提升recall召回率:能搜索到的结果的比率)
    分析器
        character filter:字符过滤
            html_strip:过滤html标签
            mapping:自定义字符映射
            pattern_replace:正则替换
        token filter
        tokenizer:分词器
            内置分词器
                standard 
                其他14种
                自定义分词器
                中文分词器
                    IK
                        analyzer
                            ik_smart:粗粒度
                            ik_max_word:细粒度
                        IK文件描述
                            安装
                                下载:https://github.com/medcl/elasticsearch-analysis-ik
                                创建插件文件夹 cd your-es-root/plugins/ && mkdir ik
                                将插件解压缩到文件夹 your-es-root/plugins/ik
                                重新启动es
                            IKAnalyzer.cfg.xml:词库配置文件
                            词库文件
                                主词库:main.dic
                                英文停用词:stopword.dic
                                quantifier.dic:特殊词库:计量单位等
                                suffix.dic:特殊词库:后缀名
                                surname.dic:特殊词库:百家姓
                                preposition:特殊词库:语气词
                            热更新
                                修改源码

环境
    安装ES
        依赖:JDK
        下载地址:https://www.elastic.co/cn/downloads/elasticsearch
        启动:Linux  ./elasticsearch -d   Windows: bin目录下双击elasticsearch.bat
        验证:http://localhost:9200/
    Head插件:附件
    Kibana:附件
    开发模式和生产模式
        开发模式:
        生产模式:

集群
    健康值检查
        脚本
            ①_cat/health?v
            _cluster/health
                cluster_name:集群名称
                status:健康值状态
                timed_out:是否超时
                number_of_nodes:节点数量
                number_of_data_nodes:数据节点数量
                active_primary_shards:活跃的主分片数
                active_shards:活跃的总分片数
                relocating_shards:迁移中的分片数
                initializing_shards:初始化中的分片数
                unassigned_shards:未分配的分片数
                active_shards_percent_as_number:活跃分片的百分比
        健康值状态
            Green
            Yellow
            Red 
    配置
        node.master:是否为候选节点
        node.data:是否为数据节点
        discovery.zen.minimum_master_nodes:最小投票节点数
    ES-node
        Master:主节点
        voting:投票节点
        coordinating:协调节点
        Master-eligible node:候选节点
        Data node:数据节点
        Ingest node
        Machine learning node:机器学习节点

aggs

底层原理及优化
    并发控制
        悲观锁
        乐观锁
 

标签:索引,常见,shard,查询,概念,elasticsearch,分片,Master,节点
来源: https://blog.csdn.net/stone_tomcate/article/details/119324334

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有