ElasticSearch入门
文档Document
用户存储在es中的数据文档,是es存储数据的最小的一个单元。类似于关系型数据表中的一行数据。
每一个文档都有一个唯一的id标识:自行指定、es自动生成
Json Object,由字段(Field)组成,常见的数据类型如下:
- 字符串:text(分词)、keyword(不分词)
- 数字型:long、integer、short、byte、double、float、half_float、scaled_float
- 布尔:boolean
- 日期:date
- 二进制:binary
- 范围类型:integer_range、float_range、long_range、double_range、date_range
元数据
用于标注文档的相关信息
- _index:文档所在的索引名
- _type:文档所在的类型名
- _id:文档唯一id
- _uid:组合id,由_type和_id组成(6.x_type不再起作用,同_id一样)
- _source:文档的原始Json数据,可以从这个获取每一个字段的内容
- _all:整合所有字段的内容到该字段,默认禁用
索引Index
由具有相同字段的文档列表组成。类似于关系型数据库中的表,6.0版本。
索引中存储具有相同结构的文档(Document)。每个索引都有自己的mapping定义,用于定义字段名和类型
一个集群可以有多个索引。比如:
Nginx日志存储的时候可以按照日期每天生成一个索引存储
- nginx-log-2017-01-01
- nginx-log-2017-01-02
- nginx-log-2017-01-03
节点Node
一个ElasticSearch的运行实例,是集群的构成单元。
集群Cluster
由一个或多个节点组成,对外提供服务
Rest API
ElasticSearch集群对外提供RESTful API
- REST REpresentational State Transfer
- URI指定资源,如Index、Document
- Http Method指明资源操作类型,如GET、POST、PUT、DELTE等
交互方式:
- Curl命令行
- Kibana DevTools
索引API
es有专门的Index API,用户创建、更新、删除索引配置等
- PUT /test_index --创建索引
- GET _cat/indices --查看索引
- DELETE /test_index --删除索引
- POST /test_index/doc/1/_update --更新索引
文档Document API
es有专门的Document API /index/type/id
-
创建文档
- 指定ID:PUT /test_index/doc/1 {"username":"alfred","age":1} 创建文档时,如果索引不存在,es会自动创建index和type
- 不指定ID:POST /test_index/doc {"username":"tom","age":20}
-
查询文档
- 指定ID:GET /test_index/doc/1
- 搜索所有文档:GET /test_indes/doc/_search {"query":{"term":{"_id":1}}}
-
批量创建
- endpoint为_bulk POST _pulk action_tye:index、update、create、delete {"index":{"_index":"test_index","_type":"doc","_id":"3"}} {"username":"LZH","age":45} {"delete":{"_index":"test_index","_type":"doc","_id":"gg0mF2UBL7MW6CurOJYJ"}} {"update":{"_index":"test_index","_type":"doc","_id":1}} {"doc":{"age":11}}
-
批量查询
- endpoint为_mget GET _mget {"docs":[{"_index":"test_index","_type":"doc","_id":1},{"_index":"test_index","_type":"doc","_id":2},]}
倒排索引和分词
举例:在书中,目录页对应正排索引,索引页对应倒排索引
正排索引:可以通过文档的id到文档内容、单词(需要做分词处理)的关联关系
倒排索引:单词到文档id的关联关系
正排索引
文档ID到文档内容、单词的关联关系,类似于书的目录,类似如下表格,根据文档ID获取内容
文档ID | 文档内容 |
---|---|
1 | ElasticSearch是最流行的搜索引擎 |
2 | php是世界上最好的语言 |
3 | ElasticSearch搜索引擎是如何诞生的 |
倒排索引
单词到文档ID的关联关系,类似书的索引页,类似如下表格,分词是倒排索引的一个前提条件,只有将文档内容进行分词以后才能进行倒排索引
单词 | 文档ID列表 |
---|---|
ElasticSearch | 1、3 |
流行 | 1 |
搜索引擎 | 1、3 |
php | 2 |
世界 | 2 |
最好 | 2 |
语言 | 2 |
如何 | 3 |
诞生 | 3 |
查询实例步骤
- 通过倒排索引查询获得"搜索引擎"的对应的内容的ID有1和3
- 通过正排索引查询1和3,获取完整的内容
- 返回用户最终结果
ElasticSearch语法
_search查询数据
查询该索引下所有数据
bash
GET /aaa/_search
根据条件查询
match
json
{
"query": {
"match": {
"name": "张三"
}
}
}
该语法是查询索引数据中带有"张三"的数据,但是es采用的是倒排索引,也就是拆词,索引name中带有"张三"的数据,会被查出来 备注 如果要精准查询,可以在字段加个keyword
bash
GET /aaa/_search
{
"query": {
"match": {
"name.keyword": "张三"
}
}
}
查询结果为
must
must子句:文档必须匹配must查询条件
bash
GET /aaa/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三"
}
}
]
}
}
}
must_not
文档不能匹配must_not查询条件; 语法为
bash
GET /aaa/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三"
}
}
],
"must_not": [
{
"match": {
"title": "bar"
}
}
]
}
}
}
should
should子句:查询一个或多个; 语法为
bash
bash
复制代码
GET /aaa/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "张三"
}
},
{
"match": {
"name": "asds"
}
}
]
}
}
}
可以理解为查询name包含张三或者asds,查询结果为
filter
根据类型过滤,如根据年龄过滤
bash
GET /aaa/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
]
}
}
}
根据id查询
(1)根据id查询单个
bash
GET /aaa/_doc/1
(2)根据多个id取回多个文档
bash
GET /_mget
{
"docs" : [
{
"_index" : "aaa",
"_id" : 20
},
{
"_index" : "aaa",
"_id" : 1
}
]
}
保存数据
(1)指定主键
bash
PUT /aaa/_doc/20
{
"id": 20,
"name": "John",
"age": 20
}
指定文档的id为20
(2)随机生成主键id
bash
POST /aaa/_doc
{
"id": 20,
"name": "Joh1n",
"age": 20
}
更新数据
bash
PUT /aaa/_doc/20
{
"id": 20,
"name": "John20",
"age": 20
}
如果id=20存在就更新
总结
es查询语法同级分为 must(等于并且等于的条件查询) must_not(不等于的条件查询) should(等于或者等于的条件查询) filter(数据过滤,范围查询,大于小于的条件查询)