Elasticsearch使用总结
原文出自:https://www.2cto.com/database/201612/580142.html
ELK干货:http://www.cnblogs.com/xing901022/p/4704319.html
自己存的东西 方便以后看
java里面debugger之后把查询的格式放到 Console - Kibana 里查 工具:Console - Kibana
Elasticsearch 2.3.3 JAVA api说明文档:https://www.blog-china.cn/template/documentHtml/1484101683485.html
这是官方对Elasticsearch的定位。通俗的讲,Elasticsearch就是一款面向文档的NoSQL数据库,使用JSON作为文档序列化格式。但是,它的高级之处在于,使用Lucene作为核心来实现所有索引和搜索的功能,使得每个文档的内容都可以被索引、搜索、排序、过滤。同时,提供了丰富的聚合功能,可以对数据进行多维度分析。对外统一使用REST API接口进行沟通,即Client与Server之间使用HTTP协议通信。
     首先,来看看在存储上的基本概念,这里将其与MySQL进行了对比,从而可以更清晰的搞清楚每个概念的意义。
| Elasticsearch | MySQL | 
|---|---|
| index(索引,名词) | database | 
| doc type(文档类型) | table | 
| document(文档) | row | 
| field(字段) | column | 
| mapping(映射) | schema | 
| query DSL(查询语言) | SQL | 
然后,来看看倒排索引的概念(官方解释)。倒排索引是搜索引擎的基石,也是Elasticsearch能实现快速全文搜索的根本。归纳起来,主要是对一个文档内容做两步操作:分词、建立“单词-文档”列表。举个例子,假如有下面两个文档:
1. {"content": "The quick brown fox jumped over the lazy dog"}
2. {"content": "Quick brown foxes leap over lazy dogs in summer"}
Elasticsearch会使用分词器对content字段的内容进行分词,再根据单词在文档中是否出现建立如下所示的列表,√表示单词在文档中有出现。假如我们想搜索“quick brown”,只需要找到每个词在哪个文档中出现即可。如果有多个文档匹配,可以根据匹配的程度进行打分,找出相关性高的文档。
| Term | Doc_1 | Doc_2 | 
|---|---|---|
| Quick | √ | |
| The | √ | |
| brown | √ | √ | 
| dog | √ | |
| dogs | √ | |
| fox | √ | |
| foxes | √ | |
| in | √ | |
| jumped | √ | |
| lazy | √ | √ | 
| leap | √ | |
| over | √ | √ | 
| quick | √ | |
| summer | √ | |
| the | √ | 
最后,我们再回过头看看上面的映射的概念。类似于MySQL在db schema中申明每个列的数据类型、索引类型等,Elasticsearch中使用mapping来做这件事。常用的是,在mapping中申明字段的数据类型、是否建立倒排索引、建立倒排索引时使用什么分词器。默认情况下,Elasticsearch会为所有的string类型数据使用standard分词器建立倒排索引。
查看mapping:GET https://localhost:9200/<index name="">/_mapping
NOTE: 这里的index是blog,doc type是test
{
"blog": {
"mappings": {
"test": {
"properties": {
"activity_type": {
"type": "string",
"index": "not_analyzed"
},
"address": {
"type": "string",
"analyzer": "ik_smart"
},
"happy_party_id": {
"type": "integer"
},
"last_update_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
}
}</index>
数据插入
在MySQL中,我们需要先建立database和table,申明db schema后才可以插入数据。而在Elasticsearch,可以直接插入数据,系统会自动建立缺失的index和doc type,并对字段建立mapping。因为半结构化数据的数据结构通常是动态变化的,我们无法预知某个文档中究竟有哪些字段,如果每次插入数据都需要提前建立index、type、mapping,那就失去了其作为NoSQL的优势了。
直接插入数据:POST https://localhost:9200/blog/test
{
"count": 5,
"desc": "hello world"
} 查看索引:GET https://localhost:9200/blog/_mapping
{
"blog": {
"mappings": {
"test": {
"properties": {
"count": {
"type": "long"
},
"desc": {
"type": "string"
}
}
}
}
}
}
然而这种灵活性是有限,比如上文我们提到,默认情况下,Elasticsearch会为所有的string类型数据使用standard分词器建立倒排索引,那么如果某些字段不想建立倒排索引怎么办。Elasticsearch提供了dynamic template的概念来针对一组index设置默认mapping,只要index的名称匹配了,就会使用该template设置的mapping进行字段映射。
??下面所示即创建一个名称为blog的template,该template会自动匹配以”blog_”开头的index,为其自动建立mapping,对文档中的所有string自动增加一个.raw字段,并且该字段不做索引。 这也是ELK中的做法,可以查看ELK系统中Elasticsearch的template,会发现有一个名为logstash的template。
创建template:POST https://localhost:9200/_template/blog
{
"template": "blog_*",
"mappings": {
"_default_": {
"dynamic_templates": [{
"string_fields": {
"mapping": {
"type": "string",
"fields": {
"raw": {
"index": "not_analyzed",
"ignore_above": 256,
"type": "string"
}
}
},
"match_mapping_type": "string"
}
}],
"properties": {
"timestamp": {
"doc_values": true,
"type": "date"
}
},
"_all": {
"enabled": false
}
}
}
} 直接插入数据:POST https://localhost:9200/blog_2016-12-25/test
{
"count": 5,
"desc": "hello world"
}
插入问题还有个话题就是批量插入。Elasticsearch提供了bulk API用来做批量的操作,你可以在该API中自由组合你要做的操作和数据,一次性发送给Elasticsearch进行处理,其格式是这样的。
action_and_meta_data\n
optional_source\n
action_and_meta_data\n
optional_source\n
....
action_and_meta_data\n
optional_source\n 比如:
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
如果是针对相同的index和doc type进行操作,则在REST API中指定index和type即可。批量插入的操作举例如下:
批量插入:POST https://localhost:9200/blog_2016-12-24/test/_bulk
{"index": {}}
{"count": 5, "desc": "hello world 111"}
{"index": {}}
{"count": 6, "desc": "hello world 222"}
{"index": {}}
{"count": 7, "desc": "hello world 333"}
{"index": {}}
{"count": 8, "desc": "hello world 444"} 查看插入的结果:GET https://localhost:9200/blog_2016-12-24/test/_search
数据查询
Elasticsearch的查询语法(query DSL)分为两部分:query和filter,区别在于查询的结果是要完全匹配还是相关性匹配。filter查询考虑的是“文档中的字段值是否等于给定值”,答案在“是”与“否”中;而query查询考虑的是“文档中的字段值与给定值的匹配程度如何”,会计算出每份文档与给定值的相关性分数,用这个分数对匹配了的文档进行相关性排序。
??在实际使用中,要注意两点:第一,filter查询要在没有做倒排索引的字段上做,即上面mapping中增加的.raw字段;第二,通常使用filter来缩小查询范围,使用query进行搜索,即二者配合使用。举例来看,注意看三个不同查询在写法上的区别:
1. 只使用query进行查询:
POST https://localhost:9200/user_action/_search
查询的结果是page_name字段中包含了wechat所有文档
这里使用size来指定返回文档的数量,默认Elasticsearch是返回前100条数据的
{
"query": {
"bool": {
"must": [{
"match": {
"page_name": "wechat"
}
},
{
"range": {
"timestamp": {
"gte": 1481218631,
"lte": 1481258231,
"format": "epoch_second"
}
}
}]
}
},
"size": 2
} 2. 只使用filter进行查询:
POST https://localhost:9200/user_action/_search
查询的结果是page_name字段值等于"example.cn/wechat/view.html"的所有文档
{
"filter": {
"bool": {
"must": [{
"term": {
"page_name.raw": "example.cn/wechat/view.html"
}
},
{
"range": {
"timestamp": {
"gte": 1481218631,
"lte": 1481258231,
"format": "epoch_second"
}
}
}]
}
},
"size": 2
} 3. 同时使用query与filter进行查询:
POST https://localhost:9200/user_action/_search
查询的结果是page_name字段值等于"example.cn/wechat/view.html"的所有文档
{
"query": {
"bool": {
"filter": [{
"bool": {
"must": [{
"term": {
"page_name.raw": "job.gikoo.cn/wechat/view.html"
}
},
{
"range": {
"timestamp": {
"gte": 1481218631,
"lte": 1481258231,
"format": "epoch_second"
}
}
}]
}
}]
}
},
"size": 2
}
聚合分析
类似于MySQL中的聚合由分组和聚合计算两种,Elasticsearch的聚合也有两部分组成:Buckets与Metrics。Buckets相当于SQL中的分组group by,而Metrics则相当于SQL中的聚合函数COUNT,SUM,MAX,MIN等等。聚合分析自然离不开对多个字段值进行分组,在MySQL中,我们只要使用“group by c1, c2, c3”就可以完成这样的功能,但是Elasticsearch没有这样的语法。Elasticsearch提供了另一种方法,即Buckets嵌套,仔细想想,似乎这种设计更加符合人的思维方式。举例来看具体操作方法:
1. 最简单的聚合查询
POST https://localhost:9200/user_action/_search
为了简单,这里删除了query的条件描述
将符合条件的文档按照公司进行聚合
这里有两个size,和aggs并列的size=0表示返回结果不包含查询结果,只返回聚合结果,terms里面的size表示返回的聚合结果数量
{
"aggs": {
"company_terms": {
"terms": {
"field": "company",
"size": 2
}
}
},
"size": 0
} 2. Buckets与Metric配合
POST https://localhost:9200/user_action/_search
将符合条件的文档按照公司进行聚合,并获取每个公司最近一次操作的时间
{
"aggs": {
"company_terms": {
"terms": {
"field": "company",
"size": 2
},
"aggs": {
"latest_record": {
"max": {
"field": "timestamp"
}
}
}
}
},
"size": 0
} 3. Buckets嵌套
POST https://localhost:9200/user_action/_search
将符合条件的文档先按照公司进行聚合,再对每个公司下的门店进行聚合,并获取每个门店最近一次操作的时间
{
"aggs": {
"company_terms": {
"terms": {
"field": "company",
"size": 1
},
"aggs": {
"store_terms": {
"terms": {
"field": "store",
"size": 2
},
"aggs": {
"latest_record": {
"max": {
"field": "timestamp"
}
}
}
}
}
}
},
"size": 0
}
Elasticsearch使用总结的更多相关文章
- Elasticsearch之java的基本操作一
		摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ... 
- Elasticsearch 5.0 中term 查询和match 查询的认识
		Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ... 
- 以bank account 数据为例,认识elasticsearch query 和 filter
		Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ... 
- Ubuntu 14.04中Elasticsearch集群配置
		Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ... 
- ElasticSearch 5学习(10)——结构化查询(包括新特性)
		之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ... 
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
		在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ... 
- .net Elasticsearch 学习入门笔记
		一. es安装相关1.elasticsearch安装 运行http://localhost:9200/2.head插件3.bigdesk插件安装(安装细节百度:windows elasticsear ... 
- 自己写的数据交换工具——从Oracle到Elasticsearch
		先说说需求的背景,由于业务数据都在Oracle数据库中,想要对它进行数据的分析会非常非常慢,用传统的数据仓库-->数据集市这种方式,集市层表会非常大,查询的时候如果再做一些group的操作,一个 ... 
- 如何在Elasticsearch中安装中文分词器(IK+pinyin)
		如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. ... 
- jar hell & elasticsearch  ik  版本问题
		想给es 安装一个ik 的插件, 我的es 是 2.4.0, 下载了一个版本是 1.9.5, [2016-10-09 16:56:26,248][INFO ][node ] [node-2] init ... 
随机推荐
- codeforces 37 E. Trial for Chief【spfa】
			想象成一层一层的染,所以相邻的两个格子连边,边权同色为0异色为1,然后答案就是某个格子到距离它最远得黑格子的最短距离的最小值 注意特判掉不需要染色的情况 #include<iostream> ... 
- uva 11292 The Dragon of Loowater(贪心)
			题目大意: 你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头).村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币.如何雇佣骑士才 ... 
- SQL Server触发器创建、删除、修改、查看示例步骤
			一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ... 
- Java多线程(八) synchronized 抛出异常锁自动解除
			当一个线程执行的代码出现异常时,其所持有的锁会自动释放 public class MyObject { private int i = 1; synchronized public void meth ... 
- 二分图最大匹配(匈牙利算法) UVA 670 The dog task
			题目传送门 /* 题意:bob按照指定顺序行走,他的狗可以在他到达下一个点之前到一个景点并及时返回,问狗最多能走多少个景点 匈牙利算法:按照狗能否顺利到一个景点分为两个集合,套个模板 */ #incl ... 
- CentOS6.5磁盘分区和挂载操作记录
			CentOS6.5磁盘分区和挂载操作记录. [root@CentOS ~]# fdisk -l Disk /dev/sda: bytes heads, sectors/track, cylinders ... 
- Axis通过wsdd部署Web Service
			axis网上的教程很多,不过搜来搜去,总是只有那么几篇.仔细看了一下那几篇文章,都感觉到不是自己想要的,所以自己整理了一篇分享一下. 本文介绍axis应用的一个小例子,没有麻烦的命令行操作,只需照下面 ... 
- Kali Linux的介绍
			Kali Linux是什么? Kali Linux是一个渗透测试平台兼安全审计平台,它集成了多款漏洞检测.目标识别和漏洞利用工具. Kali Linux是专门用于渗透测试的Linux操作系统:基于De ... 
- Python的变量类型
			一.概要 二.数字类型(Numbers) 1.Python支持的数字类型 int(有符号整型) long(长整型) float(浮点型) complex(复数) 2.类型转换 int(x ) #将 ... 
- Java编程思想读书笔记_第6章(访问权限)
			四种访问权限: public private 包访问权限 protected 如果没有明确指定package,则属于默认包 package access.dessert; public class C ... 
