介绍

ElasticSearch是一款搜索引擎中间件,因其强大的全文索引、查询统计能力和非常方便的全套基于Restful的接口,以及在自动分片、无停机升级扩容、故障转移等运维方面的高效性,逐渐成为中小型甚至非专门处理搜索业务的大型公司的首选搜索引擎方案。

入门可以看完整汉化的《Elasticsearch: 权威指南》,但打算上手实践或者应用到生产时,建议还是过一遍对应你所使用版本的英文文档

安装

之前有写过一篇ELK安装笔记,这里就不重复介绍了。

基本管理

之前在搭建ELK的时候,我并没有深入去研究ElasticSearch,更多的是看如何搭配Logstash和各种beats来收集我需要的服务器日志和应用日志,以及去尝试理解kibana界面的使用。而在写作本文的时候,我已经完成了ElasticSearch在公司业务中的使用,虽然只是简单索引订单和一些关键业务数据以便于出统计图表,还没真正去用全文搜索(要考虑分词插件和词库维护等,暂时没有足够资源去支持)功能,但也足以意识到ElasticSearch才是ELK的核心。

注:完整看过ElasticSearch的查询语法、索引机制和聚合能力后,使用kibana会更顺手。

下面记一些常见意图的实现和我初步使用的经验。

查看索引,分片数、副本数

curl -XGET http://localhost:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open boss_ecom_events-init 2fTTEmCsQFe1mJRYl9WAyg 5 1 38653 0 17mb 17mb
yellow open .kibana l0eRtbUdTNSbEcKWmTJ1Yg 1 1 2 1 12kb 12kb
yellow open logstash-2017.07.20 RejKqjPvRZeSoNaJ9mdq6A 5 1 3 0 28.2kb 28.2kb
green open boss_ecom_indexservice RRHlbrxvT-eX64vf3PhNyA 1 0 56259 0 28.5mb 28.5mb
green open dev-boss_ecom_indexservice 8WuyMnrzSbqETqkadAm3TA 1 0 56267 3 28.6mb 28.6mb
yellow open dev-boss_ecom_events-init hAekN-C3TCa6B27TvycJWw 5 1 38653 0 16.7mb 16.7mb
yellow open test_datetime wL02JY1fRMi03TiHB-R_1w 5 1 3 0 16.1kb 16.1kb
  • health:健康状况,红黄绿针对的是该索引在当前集群的可用级别。一般情况下,yellow表示指定的副本数不足,red表示有分片出问题了。
  • status:索引除了创建和删除,还可以关闭以节省资源。
  • index:索引名称
  • uuid:略
  • pri:分片数,默认5
  • rep:副本数,默认1
  • docs.count:索引中的文档数量
  • docs.deleted:索引中删除的文档数量
  • size:索引占用磁盘大小(store.size和pri.store.size的区别没注意过,具体请参考官方文档)

查看模板,设置默认分片数、副本数

创建一个索引模板:

curl -XPUT http://localhost:9200/_template/my_all -d '{"template":"*","settings":{"number_of_shards":3,"number_of_replicas":0}}'

查看索引模板列表:

curl -XGET http://localhost:9200/_cat/templates?v
name template order version
my_all * 0

查看指定索引模板内容:

curl -XGET http://localhost:9200/_template/my_all?pretty
{
"my_all" : {
"order" : 0,
"template" : "*",
"settings" : {
"index" : {
"number_of_shards" : "3",
"number_of_replicas" : "0"
}
},
"mappings" : { },
"aliases" : { }
}
}

通过索引模板,我们可以预先设定符合模板中指定命名规则的索引在创建时的配置参数,比如这里设置副本数为0,分片数为3。

注意:副本数在索引创建后还可以修改,但是分片数一旦指定,就无法修改。除非明确知道自己要干什么,一般不建议修改分片数量。

查看mapping、setting,设置mapping设置setting

查看索引映射mapping:

curl -XGET http://localhost:9200/test_datetime/_mappings?pretty
{
"test_datetime" : {
"mappings" : {
"accountregistermqmessage" : {
"properties" : {
"eventTime" : {
"type" : "date"
},
"mobile" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"operatorUserId" : {
"type" : "long"
},
"userId" : {
"type" : "long"
},
"userType" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"orders" : {
"properties" : {
"creationTime" : {
"type" : "date"
},
...//略
}
}
}
}
}

查看索引setting:

curl -XGET http://localhost:9200/test_datetime/_settings?pretty
{
"test_datetime" : {
"settings" : {
"index" : {
"creation_date" : "1509089305484",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"uuid" : "wL02JY1fRMi03TiHB-R_1w",
"version" : {
"created" : "5050099"
},
"provided_name" : "test_datetime"
}
}
}
}

设置setting:

curl -XPUT http://localhost:9200/clientlog-*/_settings -d '{"number_of_replicas":0}'

设置mapping和设置setting类似,只要PUT对应上面查询到的Json结构的键值到/索引名/_mappingsAPI即可,由于映射涉及数据类型等较复杂的规则和作用,这里不展开了。

简单search,多索引、多类型

命令行简单查询:

curl -XGET http://localhost:9200/boss_ecom_indexservice/_search?pretty=%26q=abc

上述所有curl命令中,api路径涉及指定索引名称和类型的url段都支持通配符,如/clientlog-*/_settings

SDK NEST使用示例

对于比较复杂的查询,在命令行上编辑请求体Json对象就非常麻烦了,可以使用官方SDK:Elasticsearch.Net & NEST

代码示例:

其他经验

  • Q:如何全局设置索引属性?

  • A:索引模板。

  • Q:遇到时间不准的问题?

  • A:索引时区、查询时区、聚合时区,建议索引文档时涉及时间的字段全部带上时区信息,查询指定时间范围和按时间聚合时,也明确指定时区,否则会发生一些时间对不上的问题。如果用CSharp开发语言,请用DateTimeOffset代替DateTime

  • Q:为什么ElasticSearch 6.0 开始逐渐抛弃对多类型的支持?

  • A:lucena的限制(不支持多类型),如果ElasticSearch中的索引多个类型遇到有相同名称的字段,这些同名字段不能是不同的数据类型。

  • Q:terms聚合默认只取10个?

  • A:设置Size。

  • Q:直接在命令行里构建请求体好麻烦!

  • A:复杂查询用NEST构建,用fiddler抓包再复制并修改请求体进行调试。

  • Q:父子文档、parent、routing有依赖关系!

  • A:父文档必须先于子文档完成索引,否则相应子文档无法完成索引。

  • Q:嵌套文档和父子文档的区别?

  • A:都是用来表达主从关系的,区别是父子文档各自独立,子文档变更时不会影响父文档,嵌套文档则是任一边变更将导致主从双方全部重新索引。

  • Q:命令行执行curl时,&符号怎么转义?

  • A:%26,特别的,在_search时需要加上pretty,应该/_search?pretty=%26q=abc注意pretty后面的等号不可省略。

  • Q:如何设置ElasticSearch的访问账号及密码?

  • A:ElasticSearch的收费插件X-Pack可以解决安全性问题,请参考ELK安装笔记。如果不想付费,可以和web站点一样设置ElasticSearch绑定内网IP。(对于kibana,可以做访问ip限制)

  • Q:聚合结果想附带一些其他信息?

  • A:使用TopHits聚合。

    例:.Aggregations(aggs2 => aggs2.TopHits("OrgName", th => th.Source(src => src.Includes(i => i.Field(f => f.Buyer.OrganizationLeaderName))).Size(1)))

[2017-12-20]ElasticSearch 小记的更多相关文章

  1. 2017.12.20 Java中的 IO/XML学习总结 File类详细

    IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...

  2. Gitlab一键端的安装汉化及问题解决(2017/12/14目前版本为10.2.4)

    Gitlab的安装汉化及问题解决 一.前言 Gitlab需要安装的包太TM多了,源码安装能愁死个人,一直出错,后来发现几行命令就装的真是遇到的新大陆一样... ... 装完之后感觉太简单,加了汉化补丁 ...

  3. Daily Scrum 12.20

    Member Task on 12.20 Task on 12.21 仇栋民 继续Task972 : 完成活动评分基础功能 完成Task972 : 完成活动评分基础功能 康家华 完成 Task1010 ...

  4. 【2017.12.12】deepin安装U盘制作,支持 BIOS+UEFI,deepin_Recovery+Win PE

    U盘要求为 FAT32,MBR分区表 如果需要放 4GB 大文件,可以分两个分区,第一分区FAT32格式,放启动相关文件,第二个分区用 NTFS 格式,放其它资料. 最新 Win10 支持显示 U盘 ...

  5. 2017.12.21-JQuery

    作业:密码加强验证 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...

  6. 2017.12.25 Mybatis物理分页插件PageHelper的使用(二)

    参考来自: 官方文档的说明:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md 上篇博客 ...

  7. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...

  8. java一周学习记录(2017/12/2)

    姓名:Danny                               日期:2017/12/2 周日 周一 周二 周三 周四 周五 周六 所花时间 120 150 190 150 180 28 ...

  9. AI行业精选日报_人工智能(12·20)

    IDC:中国智能家居市场2020年十大预测 12 月 20 日消息,「IDC 咨询」官方公众号发布「中国智能家居 2020 年十大预测」.具体内容如下:互联平台加速整合.语音助手广泛赋能.智能电视显著 ...

  10. 【2017.12.05 智能驾驶/汽车电子】转载:如何成为一名无人驾驶工程师 By刘少山

    之前对无人驾驶的理解就是通过刘少山老师的书:第一本无人驾驶技术书 通读之后,对智能驾驶有了一个初步的认识,如感知.决策.控制都涉及哪些领域,有哪些可以利用的技术: 但经过一段时间的实践,发现即使是在我 ...

随机推荐

  1. 查询执行慢的SQL

    --执行慢的SQL: SELECT S.SQL_TEXT, S.SQL_FULLTEXT, S.SQL_ID, ROUND(ELAPSED_TIME / 1000000 / (CASE WHEN (E ...

  2. 【音乐App】—— Vue-music 项目学习笔记:歌手页面开发

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 一.歌手页面布局与设计 需 ...

  3. Linux命令之basename 命令

        用途 返回一个字符串参数的基本文件名称. 语法 basename String [ Suffix ] 描述 basename 命令读取 String 参数,删除以 /(斜杠) 结尾的前缀以及任 ...

  4. UVA1406 - A Sequence of Numbers(树状数组)

    UVA1406 - A Sequence of Numbers(树状数组) 题目链接 题目大意: 给定N个数字.给两种操作:C x: 把这N个数字都加上x. Q x:查询这N个数里面有多少个数字和2^ ...

  5. mysql莫名的主键重复

    REPAIR TABLE t_car_type; OPTIMIZE TABLE t_car_type; 可解决问题

  6. PS中混合模式是什么意思?

      PS中图层混合模式中的溶解,变暗,正片叠底,颜色加深,线性加深,叠加,柔光,亮光,强光,线性光,点光,实色混合,差值,排除,色相,饱和度,颜色,亮度各是什么原理?   Normal 正常模式,也是 ...

  7. php创建无限极目录代码

    php创建无限极目录代码 <?php //无限级目录 function dirs($path,$mode=0777){ if(is_dir($path)){ echo '目录已经存在!'; }e ...

  8. 使用 mybatis + flying + 双向相关建模 的电商后端

    代码地址如下:http://www.demodashi.com/demo/12468.html mybatis.flying 众所周知,mybatis 虽然易于上手,但放到互联网环境下使用时,不可避免 ...

  9. 动态载入Layout 与 论Activity、 Window、View的关系

    1)动态载入Layout的代码是 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null)); ...

  10. 超出用省略号function()

    //判断是否微信浏览器 function isWeiXin() { var ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/M ...