es之概念/关键词

Elasticsearch与关系数据的类比对应关系如下:
    Relational DB      ⇒     Databases     ⇒     Tables         ⇒     Rows         ⇒     Columns
    Elasticsearch      ⇒     Indices       ⇒     Types         ⇒     Documents     ⇒     Fields

【Cluster】
    集群,一个ES集群由一个或多个节点(Node)组成,每个集群都有一个cluster name作为标识。

【node】
    节点,一个ES实例就是一个node,一个机器可以有多个实例,所以并不能说一台机器就是一个node,大多数情况下每个node运行在一个独立的环境或虚拟机上。

【index】
    索引,即一系列documents的集合。

【shard】

    1. 分片,ES是分布式搜索引擎,每个索引有一个或多个分片,索引的数据被分配到各个分片上,相当于一桶水用了N个杯子装。
    2. 分片有助于横向扩展,N个分片会被尽可能平均地(rebalance)分配在不同的节点上(例如你有2个节点,4个主分片(不考虑备份),那么每个节点会分到2个分片,后来你增加了2个节点,那么你这4个节点上都会有1个分片,这个过程叫relocation,ES感知后自动完成)。
    3. 分片是独立的,对于一个Search Request的行为,每个分片都会执行这个Request。
    4. 每个分片都是一个Lucene Index,所以一个分片只能存放 Integer.MAX_VALUE - 128 = 2,147,483,519 个docs。[LUCENE-5843] IndexWriter should refuse to create an index with more than INT_MAX docs

【replica】
    1. 复制,可以理解为备份分片,相应地有primary shard(主分片)。
    2. 主分片和备分片不会出现在同一个节点上(防止单点故障),默认情况下一个索引创建5个分片一个备份(即5primary+5replica=10个分片)
    3. 如果你只有一个节点,那么5个replica都无法分配(unassigned),此时cluster status会变成Yellow。
      ES集群状态有三种:
        Green:所有主分片和备份分片都准备就绪(分配成功),即使有一台机器挂了(假设一台机器一个实例),数据都不会丢失,但会变成Yellow状态
        Yellow:所有主分片准备就绪,但存在至少一个主分片(假设是A)对应的备份分片没有就绪,此时集群属于警告状态,意味着集群高可用和容灾能力下降,如果刚好A所在的机器挂了,并且你只设置了一个备份(已处于未就绪状态),那么A的数据就会丢失(查询结果不完整),此时集群进入Red状态
        Red:至少有一个主分片没有就绪(直接原因是找不到对应的备份分片成为新的主分片),此时查询的结果会出现数据丢失(不完整)
    4. replica的作用主要包括:
        a.容灾:primary分片丢失,replica分片就会被顶上去成为新的主分片,同时根据这个新的主分片创建新的replica,集群数据安然无恙
        b. 提高查询性能:replica和primary分片的数据是相同的,所以对于一个query既可以查主分片也可以查备分片,在合适的范围内多个replica性能会更优(但要考虑资源占用也会提升[cpu/disk/heap]),另外index request只能发生在主分片上,replica不能执行index request。
    5. 对于一个索引,除非重建索引否则不能调整分片的数目(主分片数, number_of_shards),但可以随时调整replica数(number_of_replicas)。

TF/IDF算法:TF词频,DF词条存在的文档数
METHOD:
    GET:查询
    PUT:添加/更新,幂等,必须指定id,若存在则全量更新
    POST:添加/更新,非幂等,可指定id,若未指定id则会自动生成一个,若存在则全量更新,可通过_update指定字段更新
    DELETE:删除索引或索引中指定id数据
    HEAD:判断数据是否存在,只返回http头文件,存在则返回200,不存在则返回404

feature:
  PUT请求:

    _mappings:设置索引mapping,PUT请求
        type:
            properties:
                field:
                    type: text/keyword/long/integer/nested
                    analyzer:
                    index:true/false
                    boost:
                    copy_to:将多个字段的值拷贝到一个字段中,并建立倒排索引
                    formate:
                    store:


  
  POST请求:
    _aliases:
        actions:
            add:添加索引别名
                index:索引名
                alias:索引别名
                is_write_index:被设置为true的索引,当对别名写数据的时候数据会被写到此索引中。
            remove:删除索引别名
                index:
                alias:
            remove_index:删除索引
            
        示例:
            POST _aliases
            {
              "actions":[
                {"remove": {"index": "parana_item","alias": "index_item"}},
                {"add":{"index":"parana_item","alias":"index_item_back"}},
                {"remove":{"index":"new_parana_item","alias":"new_parana_item"}},
                {"add":{"index":"new_parana_item","alias":"index_item"}}
                ]
            }
            
            
    _reindex:重构索引
        source:原始索引
            index:索引名
        dest:目标索引
            index:索引名
            
        示例:
            POST _reindex
            {
              "source": {
                "index": "new_suggest_index"
              },
              "dest": {
                "index": "new_suggest_index2"
              }
            }
    
    清空索引内容:
        POST new_suggest_index1/new_suggest_type/_delete_by_query
        {
          "query": {"match_all": {}}
        }
    
GET请求:    
 endpoint:
    .percolater:
    _all:GET请求,获取所有索引信息
    
    _alias:GET请求,获取索引别名
    
    _analyze:
        analyzer:指定分词器,内置分词器standard、simple、whitespace、stop、keyword、
        attributes:
        char_filter:
        explain:
        field:字段
        text:进行分词的内容
        tokenizer:
        
    _cache/clear:
     
    _cat/aliases:显示别名 GET _cat/aliases?v&h=alias,index
    _cat/allocation:查看每个数据节点上的分片数(shards),以及每个数据节点磁盘剩余
    _cat/count:查看单个或某类或整个集群文档数;#整个集群文档数GET _cat/count?v ;#某类索引文档数 GET _cat/count/.monitoring*?v
    _cat/fielddata:查看每个数据节点上fielddata当前占用的堆内存 GET _cat/fielddata?v&h=node,field,size ; #对某一字段进行查看 GET _cat/fielddata?v&h=node,field,size&fields=kibana_stats.kibana.uuid
    _cat/health:查看集群健康状况:GET _cat/health?v&h=cluster,status
    _cat/indices:查看索引 GET _cat/indices/.monitoring*?v&h=index,health
    _cat/master:查看集群master节点信息 GET _cat/master?v
    _cat/nodeattrs:查看每个节点的自定义属性 GET /_cat/nodeattrs?v
    _cat/nodes:查询集群节点信息;#集群节点: GET _cat/nodes?v ; #磁盘剩余: GET _cat/nodes?v&h=ip,node.role,name,disk.avail
    _cat/pending_tasks:查看被挂起任务 GET _cat/pending_tasks?v    
    _cat/plugins:查看每个节点正在运行的插件 GET _cat/plugins?v
    _cat/recovery:查看索引分片的恢复视图;索引分片的恢复视图,包括正在进行和先前已完成的恢复;只要索引分片移动到群集中的其他节点,就会发生恢复事件
    _cat/repositories:查看注册的快照仓库 GET _cat/repositories?v
    _cat/snapshots:查看快照仓库下的快照;
        #可将ES中的一个或多个索引定期备份到如HDFS、S3等更可靠的文件系统,以应对灾难性的故障
        #第一次快照是一个完整拷贝,所有后续快照则保留的是已存快照和新数据之间的差异
        #当出现灾难性故障时,可基于快照恢复
    _cat/segments:查看每个索引的segment :GET _cat/segments/.kibana?v&format=json&pretty
    _cat/shards:查看每个索引的分片 GET _cat/shards?v&format=json&pretty&s=index
    _cat/tasks:显示当前在集群中执行的任务的信息
    _cat/thread_pool:查看每个节点线程池的统计信息 GET _cat/thread_pool/bulk?v&format=json&pretty  #查看每个节点bulk线程池的统计信息 # actinve(活跃的),queue(队列中的)和 reject(拒绝的)
    _cat/templates:查看索引模板 GET _cat/templates?v&format=json&pretty
        verbose显示指令的详细信息
            GET _cat/health?v
        help显示指令返回参数的说明
            GET _cat/health?help
        header选择要显示的列
            GET _cat/count?h=timestamp,count
        format设置返回内容的格式,支持json,yaml,text,smile,cbor
            GET _cat/master?format=json&pretty
        sort排序
            GET _cat/indices?s=store.size:desc
        可以多个参数一起使用,用&连接
            GET _cat/indices?v&s=store.size:desc
    
    _cluster/health:
    _cluster/nodes/stats:
    _cluster/pending_tasks:
    _cluster/reroute:
    _cluster/settinds:
    _cluster/state:

    _count:GET请求,统计索引数据
    
    _field_stats:

    _mapping:查看mapping

    _mapping/field:查看某个字段的mapping

    _open:

    _close:

    _flush:
    
    _ingest/pipeline:
    _ingest/pipeline/_simulate:
    _nodes:
    _nodes/hot_threads:
    _nodes/stats:
    
    _flush/synced:
    
    _refresh:
    
    _processor:
    
    _recovery:
    
    _reindex:
    
    _render/template:
    
    _scripts:
    
    _segments:

    _search:
        _source:
            存储的原始数据。_source中的内容就是搜索api返回的内容。通过_source指定最终返回的属性字段,如 "_source": ["name","age"]
        aggs:对一份数据执行分组聚合操作,每一个分组结果称为一个bucket,对一个数据分组结果执行的统计操作称为metric
            aggs_name:聚合的名字
                aggs:aggs多次聚合
                    aggs_name:
                    ...
                avg:求平均数
                avg_bucket:
                bucket_script:
                bucket_selector:
                cardinality:类似于distinct去重过滤
                    field:去重字段
                    precision_threshold:precision_threshold值设置的越大,占用内存越大,1000 * 8 = 8000 / 1000 = 8KB,可以确保更多unique value的场景下,100%的准确
                        cardinality底层算法:HLL算法,HLL算法的性能
                children:
                cumulative_sum:
                date_histogram:日期范围分组,类似于histogram,按照指定的date类型的日期field,以及日期interval,按照一定的日期间隔,去划分bucket分组
                    factor:
                    field:分组字段
                    format:分组后展示的日期格式
                    interval:间隔
                        day:以1天为间隔
                        hour:以1小时为间隔
                        minute:以1季度为间隔
                        month:以1月为间隔
                        quarter:以1刻钟为间隔
                        second:以1秒为间隔
                        week:以1周为间隔
                        year:以1年为间隔
                    keyed:
                    min_doc_count:最小文档数量,设置为0时,该范围没有结果也会展示;不设置时该范围没有结果则不会展示
                    missing:
                    order:
                    extended_bounds:
                        min:范围起始值
                        max:范围结束值
                date_range:日期范围
                derivative:
                extended_stats:扩展统计
                filter:过滤
                filters:
                geo_bounds:
                geo_distance:
                geohash_grid:
                global:
                histogram:范围分组,类似terms,也是进行bucket分组操作,接收一个field,按照这个field值的各个范围区间,进行bucket分组操作
                    field:分组字段
                    interval:区间划分基数,数字类型,如:2000,则分组为:0-2000,2000-4000,4000-6000 ...
                    keyed:
                    min_doc_count:最小文档数量,设置为0时,该范围没有结果也会展示;不设置时该范围没有结果则不会展示
                    missing:
                    order:
                ip_range:
                matrix_stats:
                max:最大值
                max_bucket:
                min:最小值
                min_bucket:
                missing:
                moving_avg:
                nested:
                percentile_ranks:
                percentiles:求百分比
                range:范围
                reverse_nested:
                sampler:
                scripted_metric:
                serial_diff:
                significant_terms:
                stats:
                sum:求和
                sum_bucket:
                terms:根据指定字段值进行分组
                    collect_mode:
                    exclude:排除包含该值的文档
                    execution_hint:
                    field:聚合字段
                    include:匹配出包含该值的文档
                    min_doc_count:最小文档数量
                    missing:指定了缺省的字段的处理方式
                    order:排序方式
                        _term:desc/asc,根据聚合结果排序,_term可以替换成aggs的name,如avg_price
                        _count:desc/asc,数量排序
                    script:
                    shard_size:每个分片上返回的个数
                    show_term_doc_count_error:
                    size:聚合结果最后返回的term个数(默认是10个)
                top_hits:
                value_count:
            
        explain:解析
        from:开始位置
        highlight:高亮显示
            fields:
            post_tags:
            pre_tags:
            tags_schema:
        query:
            bool:
                boost:搜索条件的权重
                filter:不计算相关性,同时可以cache,因此filter的速度快于query
                minimum_should_match:去长尾,提升搜索精确度,最少匹配比例
                must:数组
                    match:分词
                    term:不分词
                must_not:必须不
                should:数组,匹配一个或多个
                    term:
                    bool:
            boosting:只有匹配了positive查询的文档才会被包含到结果集中,但是同时匹配了negative查询的文档会被降低其相关度,通过将文档原本的_score和negative_boost参数进行相乘来得到新的_score;negative_boost参数必须小于1.0
                positive:正面词条
                negative:负面词条
                negative_boost:任何包含了指定负面词条的文档的_score都会是其原本_score的negative_boost设置的值的倍数,即_score * negative_boost
            constant_score:忽略评分排序
            custom_filters_score:
            dis_max:最佳字段查询,即分离最大化查询(Disjunction Max Query): 
                将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回;某一个field中匹配到了尽可能多的关键词,被排在前面;而不是尽可能多的field匹配到了少数的关键词,排在了前面
                tie_breaker:通过参数tie_breaker来综合考虑,将其他query的分数,乘以tie_breaker,然后综合与最高分数的那个query的分数,综合在一起进行计算,除了取最高分以外,还会考虑其他的query的分数
            field:查询字段
            function_score:将某个field的值,跟es内置算出来的分数进行运算,然后由指定的field来进行分数的增强
                query:
                    multi_match:
                        query:查询内容
                        fields:查询字段数据
                field_value_factor:
                    field:评分增强字段:如果只有field,那么会将每个doc的分数都乘以指定field的值,如果有的doc 指定field的值是0,那么分数就会变为0,效果很不好
                        一般会加个modifier的log1p函数,公式会变为,new_score = old_score * log(1 + number_of_votes),这样出来的分数会比较合理
                        再加个factor,可以进一步影响分数,new_score = old_score * log(1 + factor * number_of_votes)
                    modifier:
                    factor:
                boost_mode:可以决定分数与指定字段的值如何计算,multiply,sum,min,max,replace
                max_boost:限制计算出来的分数不要超过max_boost指定的值
            fuzzy:纠错查询,自动将拼写错误的搜索文本,进行纠正,纠正以后去尝试匹配索引中的数据
                FIELD:
                    value:查询内容
                    fuzziness:搜索文本最多可以纠正几个字母去进行匹配,默认如果不设置,就是2
            geo_shape:
            has_child:
            has_parent:
            ids:
            indices:查询索引
            match:指定字段全文检索,会分词,只要简单的匹配到了一个term,就可以立即将term对应的doc作为结果返回,扫描倒排索引,扫描到了就ok
            match_all:查询所有
            match_phrase:短语检索,必须包含每个term,term之间顺序位置必须一致;通过slop指定短语之间位置间隔容差值(最多只能移动slop值的次数后匹配);通过近似匹配提升匹配度
                FIELD:
                    query:查询内容
                    analyzer:内容分词器
                    slop:关键词离得越近,相关度越高,评分越高
            match_phrase_prefix:前缀检索,模糊匹配,通过max_expansions(默认值50,最小值为1)指定模糊匹配通配符数量
                原理跟match_phrase类似,唯一的区别,就是把最后一个term作为前缀去搜索
                比如查询:hello w
                    hello就是去进行match,搜索对应的doc
                    w,会作为前缀,去扫描整个倒排索引,找到所有w开头的doc
                    然后找到所有doc中,即包含hello,又包含w开头的字符的doc
                    根据你的slop去计算,看在slop范围内,能不能让hello w,正好跟doc中的hello和w开头的单词的position相匹配
                FIELD:
                    analyzer:
                    fuzziness:模糊
                    max_expansions:限制搜索结果中前缀匹配的词所在文档的数量
                    prefix_length:前缀长度
                    query:查询内容
                    slop:词条之间的位置差
            mlt:
            more_like_this:
            multi_match:多字段匹配
                query:查询的内容
                fields:匹配字段,可以是多个                
                type:搜索匹配类型
                    best_fields:最佳匹配,将某一个field匹配尽可能多的关键词的doc优先返回回来
                    cross_fields:跨多个field查询唯一标识;要求每个term都必须在任何一个field中出现,即每个term必须在field1中出现或者在field2中出现
                    most_fields:尽可能返回更多field匹配到某个关键词的doc,优先返回回来;不要求所有的term都必须出现在任何一个field;不允许使用minimum_should_match去长尾
                    phrase:
                    phrase_prefix:前缀
                tie_breaker:多字段评分都参与就按
                use_dis_max:
                operator: OR
                slop: 0
                prefix_length: 0
                max_expansions: 50,限定最多匹配term数量
                lenient: false
                zero_terms_query: NONE
                boost: 1.0,权重
            nested:
            prefix:前缀搜索,性能差,prefix query不计算relevance score,与prefix filter唯一的区别就是,filter会cache bitset;前缀越短,要处理的doc越多,性能越差,尽可能用长前缀搜索
            query_string:
            range:范围查询
            regexp:正则查询,
                如:C[0-9].+  
                解释:[0-9]:指定范围内的数字,[a-z]:指定范围内的字母,.:一个字符,+:前面的正则表达式可以出现一次或多次;
                wildcard和regexp,与prefix原理一致,都会扫描整个索引,性能很差
            script:
            span_containing:
            span_first:
            span_near:
            span_not:
            span_or:
            span_term:
            span_within:
            term:
            terms:
            wildcard:通配符搜索,性能差,?代表任意一个字符,*代表0个或多个任意字符,例如:C?5*5,代表C开头+一个任意字符+5+任务多个字符+5结尾的查询
            simple_query_string:
        size:
        sort:
        stats:
        timeout:
        version:
        post_filter:
        docvalue_fields:
        partial_fields:
        script_fields:
        stored_fields:

    _settings:查看索引setting信息
        
    _search/template:
    
    _shard_stores:

    _search_shards:
    
    _snapshot:
    
    _snapshot/_status:

    _stats:
    
    _template:

    _upgrade:

    _validate/query:


分词:
    什么是ngram:
        quick,5种长度下的ngram
            ngram length=1,q u i c k
            ngram length=2,qu ui ic ck
            ngram length=3,qui uic ick
            ngram length=4,quic uick
            ngram length=5,quick
        
    什么是edge ngram
        quick,anchor首字母后进行ngram
            q
            qu
            qui
            quic
            quick
    edge_ngram的分词器,就是从首字开始,按步长,逐字符分词,直至最终结尾文字;ngram呢,就不仅是从首字开始,而是逐字开始按步长,逐字符分词。
    如果必须首字匹配的情况,那么用edge_ngram自然是最佳选择,如果需要文中任意字符的匹配,ngram就更为合适了。当然,涉及到中文分词的话,有一些可用的分词插件。

TF/IDF

TF(term frequency):词频,搜索文本中的各个词条在检索字段中中出现了多少次,出现的次数越多,就越相关

tfNorm:词频归一值
计算公式:
tfNorm=(freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength))
freq:检索关键词组在被检索字段的词组中出现的频率,即出现了多少次
k1、b:BM25算法的两个调节因子;k1:词的饱和度值,默认值为1.2;b:长度归一化参数,默认值为0.75;
avgFieldLength:当前分片的平均分词数(当前分片所有文档检索字段的分词个数/当前分片总文档数)
fieldLength:本文档检索字段的分词数


IDF(inverse document frequency):逆文档频率,搜索文本中的各个词条在整个索引的所有文档中出现的次数,出现的次数越多,就越不相关
计算公式:
IDF=log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5))
docFreq:此分片上检索字段中出现检索词的文档数,number of documents containing term
docCount:此分片上的文档总数,total number of documents with field

score:评分
Boost*idf*tfNorm=2*10.060062*1.0356903=20.838219

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值