elasticsearch学习笔记

  • es获取mapping curl 'localhost:9200/index/type/_mapping?pretty'

  • 设置一个新的映射 curl -XPUT 'localhost:9200/index_mapping/type' -d '{

  •         "type" : {

  •             "properties" : {

  •                 "host" :{

  •                     "type" :"string"

  •                 }

  •             }

  •         }

  •  

  •     }'

  • mapping字段中index属性有三个analyzed(分词),not_analyzed(不分词),no(不分词也不参与搜索)

  • 核心字段,string/boolean/date/数值/  核心字段都可以是数组的形式

  • _source包含了所有的数据的字段(指定返回的时候返回数据的哪个字段) ,_all包含了所有的数据的字段(搜索的时候指定查询哪个字段)

  • 在修改一篇文档的时候,其实是经过三个步骤,先搜索出旧文档,根据修改内容生成新的文档,然后把旧文档删除

  • 通过版本控制解决并发问题,每篇文章都有一个版本号,当有修改的时候版本号+1,这个时候如果有并发问题,那第二个来修改的就会修改失败,但是他会重试,修改之后把版本号再+1,这样保证修改的内容不会被覆盖

  • 索引文档的时候可以指定版本号,来进行数据的覆盖

二、查询方式

  • query_string:可以指定与或非逻辑

  • term:精确匹配

  • terms:or的关系精确匹配

  • match:会进行分词,默认是or的关系,可以指定成and

  • match_phrase: 会进行分词,然后指定词与词之间的距离

  • phrase_prefix:前缀搜索,如果有多个词,会将最后一个词进行前缀匹配,可以根据max_expansions来设置最大返回数,提高查询效率

  • multi_match:可以查询多个字段,别的功能跟match一样,可以扩展phrase和prefix

  • bool bool查询中有must(必须命中),should(或的关系,minimun_should_match设置了最小命中的数量),not_must(非的关系)

  •  range:范围查询(gt大于、gte大于等于、lt小于、lte小于等于)

  •  prefix:把给定的单词做为前缀来进行匹配

  •  wildcard:通配符,可以使用*?来进行标识(越早出现*?,性能就越差)

  •  exists:查询字段有值的文档

  •  missing:查询字段没有值的文档

三、查询分析

  • 查询分析可以设置分词,分词需要经过三个过程字符过滤(可以把规定的字符过滤掉或者转换为别的字符)、分词、分词过滤器(分词过滤器可以对分词进行一些操作,比如把大写字母转为小写)、然后创建分词索引

  • 使用分词配置有三种方式,在创建索引的时候指定分词配置、为elasticsearch集群指定分词配置、为单个字段指定分词配置

  • 可以使用分词API来查看输入的文本的分词结果,curl -XPOST ‘localhost:9200/_analyze?analyzer=ik’ -d ’share your ….’(也可以指定分析过滤器 tokenizer filters参数来指定,field字段指定根据某个字段的分词配置来进行分析)

  • 还可以使用_termvector来进一步分析查询的时候词条的使用情况

四、得分分析

  • 在根据关键词搜索的时候,得分的关键在于两个主要因素,一个是词频,另外一个是你文档频率,就是一个词在这个文档中出现的次数越多,得分越高,而一个词在文档中越罕见,就得分越高

  • 有两种方法可以指定相似度得分算法,一种是在字段中指定similarity字段中的算法,一种是在mapping中指定一个扩展,跟分析器类似,在similarity中指定扩展的名称

  • 在查询或者是模板中可以使用boost来修改这个字段的相关性,但是推荐在查询的时候使用,在query_string中,可以对单个关键词指定boost

  • 可以在查询中,跟query同级别里指定expain参数等于true,来开启分析查询的时候是怎么指定分数的

  • 还可以查询单条数据有没有匹配到, curl -XPOST ‘localhost:9200/index/type/id/_explain’ -d {}

  • es支持使用再查询,就是在确定返回的10条数据上进行得分计算,使用的事rescore

  • faction_score 这是一个针对得分的一个函数,可以针对文档的得分井陉一些计算/ weight,可以对条件命中的文档的得分进行相乘的操作,

  • score_mode控制不同函数之间的得分是如何合并的,boost_mode控制原始得分跟函数得分是如何合并的

五、聚合查询

  • 聚合查询可以在条件过滤和过滤器过滤之后进行聚合操作,如果没有查询条件默认是match_all

  • 对于post_filter后过滤器,聚合操作是在后过滤器之前进行的操作,也就是后过滤器不对聚合操作有影响

  • stats聚集可以同时获取最大值最小值平均值求和这些数值,也可以单独通过avg,min,max,value_count这些来获取,还可以通过extended_stats高级统计来获取平方根平方差这些数值

  • 使用percentiles来获取百分位,比如指定percents[80,90]获取80分一下占多少 99的值占多少

  • 使用cardinality来获取唯一字段值的基数,就是对这个字段的值去重后的数量

  • terms聚合一般使用在不需要分词的字段,会根据字段值进行聚合,默认按照数量从多到少排列,可以通过order属性指定排序是倒序还是正序,可以通过size来设置返回的数量,shared_size设置每个分片返回的数量,可以通过设置min_doc_count来设置最小返回值

  • significant_terms会判断某个词跟查询的关键词之间的关联,计算一个得分,比如某个词出现了多少次,跟查询的关键词一起出现了多少次

  • range查询需要在查询的时候指定查询的范围,然后结果里会统计返回的范围都有多少数据,通过ranges

  • date_range跟range类似,就是date_range查询的事日期,查询的事日期格式

  • histogram聚合跟range类似,但是不在手动的指定范围,而是指定间距,通过interval来指定间距,可以通过设置min_doc_count来指定最小的聚合数,如果指定了0,那就是没有数值的也会返回,默认是不返回

  • date_histogram日期直方图,需要在interval中指定间隔日期,也可以设置min_doc_count,跟histogram一样

    嵌套聚集

  • 嵌套聚集只需要在父聚集的基础上通过aggregations来指定下一次的聚集

  • top_hits可以在父聚集生成的基础上,对每个桶进行一个top排序,返回前N个结果,排序的条件可以自己指定

  • global是单桶聚集,就是聚集的结果在所有文档中进行,不受查询条件的影响,filter/filters是过滤聚集,就是在查询结果上进行聚集,missing创建的聚集是在查询条件之外

六、字段类型

  • 对象类型(type:object),将一个json作为一个字段来存储,但是当这个字段里有多个对象的时候搜索的时候会有问题,存储的时候他会把所有对象的相同字段存储在一起,对象类型的mapping设置跟主类型一致,也是通过properties来指定,也可以指定字段的类型跟一些属性,对象类型在搜索的时候,通过localtion.name(对象字段名.对象属性字段名)的方式来进行搜索,对象类型里面的属性也可以在聚集查询的时候使用,对象类型适合只有一个对象的时候使用,如果有多个对象就会产生上述说的查询不准确的问题,这是由于底层的存储导致的

  • 嵌套类型(type:nested),嵌套类型跟对象类型看上去相似的,但是存储的时候是按照每个对象来存储的,就不会产生对象类型那样的搜索问题,但是嵌套类型也有自己的问题,就是比如说查询一个字段的值等于A跟B的时候,就会查询失效,这个时候可以指定include_in_root跟include_in_parent,include_in_root可以针对嵌套文档使用嵌套查询,需要夸对象匹配的时候使用普通查询,include_in_parent用于多层级嵌套的时候使用,嵌套查询需要关键字nested来进行查询,查询的时候需要指定path来指定嵌套字段的名称,可以通过score_mode类型指定计算分档的得分(avg,total,max,none),可以通过inner_hit(from,to)来指定在查询结束返回嵌套的对象,可以通过sort中指定嵌套文档的排序,通过嵌套字段名.对象字段名的方式,通过指定mode来指定排序的依据,order来指定逆序还是正序

  • 父子关系,将索引中某个类型定义为另一个类型的子辈

  • 反规范化是通过冗余存储减少join操作的时间

七、集群

  • 集群间的发现主要有两种方式:1、广播发现,适用于IP地址总是改变的情况,主要通过在节点间配置相同的集群名称(cluster.name),让节点间自由发现,还需要把discovery.zen.ping.multicast:下的address配置成null,意思是绑定所有的网络接口。2、单播发现,适用于IP地址不会变化的情况,配置设置 discovery.zen.ping.unicast.hosts配置上传播节点

  • 在es集群中,node.master设置为true的,都有机会成为主节点,可以设置discovery.zen.minimum_master_nodes来设置集群中最小主节点

  • es的主节点会定期发送ping请求去ping别的节点,参数可以通过一下来配置

  • es删除一个节点的时候,会把副本分片更新为主分片,然后开始分片的备份

  • es停用一个节点的过程中可以使节点一直输绿色的可用状态,他会把这个节点上的分片全部备份到别的节点,然后清空这个节点的分片

  • 在节点升级的时候,可以轮流升级每个节点,这样就可以保证集群的可用性,可以设置cluster.routing.allocation.enable:none来关闭集群的分配设置,防止在升级过程中该节点被平衡了

  • es集群可以使用_cat API来查看跟监测集群的状态  curl -ZGET ‘localhost:9200/_cat/type?v'

  • es允许并推荐使用别名,可以使用api动态的来修改增加一个别名 https://www.cnblogs.com/libin2015/p/10649189.html

  • es可以在查询跟索引数据的时候指定路由值,这可以告诉集群该去哪里查询这篇数据

 

allocation

展示分配到每个节点的分片数量

count

统计整个集群或索引中文档的数量

health

展示集群的健康状态

indices

展示现有索引的信息

master

显示目前被选为主节点的节点

nodes

显示集群中所有节点的不同信息

recovery

显示集群中正在进行的分片恢复状态

shards

显示及群众分片的数量、大小和名字

plugins

显示已安装的插件信息

 

 

discovery.zen.minimum_master_nodes

设置集群中最小主节点数,建议设置节点数/2+1,可以防止脑裂

discovery.zen.fd.ping_interval

默认1s发送一次ping,也就是心跳监测

discovery.zen.fd.ping_timeout

默认是30s如果没有连接上就宣布节点失联

discovery.zen.fd.ping_retries

默认三次,超过timeout次数之后的最多重试次数

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值