ES
ES是一个使用java语言编写的并且基于Lucene编写的搜索引擎, 他提供了分布式的全文搜索服务, 还提供了一个RESTful风格的web接口
参考文档
参考
elasticsearch 大数据场景下使用scroll实现分页查询
特点
- 分布式 横向
- 全文检索
- Restful风格wen接口
和mysql对比
Elasticsearch MySQL
索引库(indices) Database 数据库
类型(type) Table 数据表
文档(Document) Row 行
域字段(Field) Columns 列
映射配置(mappings) 每个列的约束(类型、长度、是否索引、是否存储等)
可视化工具
kibana
返回值解析
1 took 耗费了几毫秒
2 timed_out 是否超时,false是没有,默认无timeout
3 _shards
4 hits.total 本次搜索,返回了几条结果
5 hits.max_score score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
6 hits.hits 包含了匹配搜索的document的详细数据,默认查询前10条数据,按_score降序排序
crud
- 新增
put
1. request
PUT 索引名/类型名/唯一ID/_create{字段名:字段值}
或
PUT 索引名/类型名/唯一ID?op_type=create{字段名:字段值}。
2. response
{
“_index”: “test_index”, 新增的document在什么index中,
“_type”: “test_type”, 新增的document在index中的哪一个type中。
“_id”: “1”, 指定的id是多少
“_version”: 1, document的版本是多少,版本从1开始递增,每次写操作都会+1
“result”: “created”, 本次操作的结果,created创建,updated修改,deleted删除
“_shards”: { 分片信息
“total”: 2, 分片数量只提示primary shard
“successful”: 1, 数据document一定只存放在index中的某一个primary shard中
“failed”: 0
},
“_seq_no”: 0, 执行的序列号
“_primary_term”: 1 词条比对。
}
POST
POST相比Put功能多一个允许主键自动生成方式
-
查询
- GET
索引名/类型名/唯一ID GET test_index/test_type/1 - GET _mget批量查询
GET _mget
{
“docs” : [
{
“_index” : “索引名”,
“_type” : “类型名”,
“_id” : “唯一ID值”
}, {}, {}
]
}
GET 索引名/_mget
{
“docs” : [
{
“_type” : “类型名”,
“_id” : “唯一ID值”
}, {}, {}
]
}GET 索引名/类型名/_mget
{
“docs” : [
{
“_id” : “唯一ID值”
},
{
“_id” : “唯一ID值”
}
]
}- 查询全部
GET 索引名/类型名/_search
- GET
-
修改
- 替换Document(全量替换)
语法:PUT 索引名/类型名/唯一ID{字段名:字段值}
注意事项
本操作相当于覆盖操作。全量替换的过程中,Elasticsearch不会真的修改Document中的数据,而是标记Elasticsearch中原有的Document为deleted状态,
再创建一个新的Document来存储数据,当Elasticsearch中的数据量过大时,Elasticsearch后台回收deleted状态的Document- 更新Document
语法:POST 索引名/类型名/唯一ID/_update{doc:{字段名:字段值}}
注意事项
只更新某Document中的部分字段。这种更新方式也是标记原有数据为deleted状态,创建一个新的Document数据,将新的字段和未更新的原有字段组成这个新的Document,并创建。
对比全量替换而言,只是操作上的方便,在底层执行上几乎没有区别 - 替换Document(全量替换)
-
删除
注意事项
Elasticsearch中执行删除操作时,Elasticsearch先标记Document为deleted状态,而不是直接物理删除。当Elasticsearch存储空间不足或工作空闲时,才会执行物理删除操作。
标记为deleted状态的数据不会被查询搜索到
语法:DELETE 索引名/类型名/唯一ID
-
bulk批量增删改
概览
使用bulk语法执行批量增删改。语法格式如下:
注意:_bulk的两个{}都不要出现换行等操作,两个{}使用回车符进行识别。
示例
POST _bulk
{ “action_type” : { “metadata_name” : “metadata_value” } }
{ document datas | action datas }语法中的action_type可选值为
create : 强制创建,相当于PUT 索引名/类型名/唯一ID/_create。主键必须有。
index: 普通的POST操作,相当于创建Document或全量替换
update: 更新操作(partial update),相当于 POST 索引名/类型名/唯一ID/_update
delete: 删除操作- 新增
POST _bulk
{ “create” : { “_index” : “test_index” , “_type” : “test_type”, “_id” : “1” } }
{ “field_name” : “field value” }
PUT
POST _bulk
{ “index” : { “_index” : “test_index”, “_type” : “test_type” , “_id” : “2” } }
{ “field_name” : “field value 2” } - 更新
POST _bulk
{ “update” : { “_index” : “test_index”, “_type” : “test_type” , “_id” : 2, “_retry_on_conflict” : 3 } }
{ “doc” : { “field_name” : “partial update field value” } } - DELETE
POST _bulk
{ “delete” : { “_index” : “test_index”, “_type” : “test_type”, “_id” : “2” } } - 批量写
POST _bulk
{ “create” : { “_index” : “test_index” , “_type” : “test_type”, “_id” : “10” } }
{ “field_name” : “field value” }
{ “index” : { “_index” : “test_index”, “_type” : “test_type” , “_id” : “20” } }
{ “field_name” : “field value 2” }
{ “update” : { “_index” : “test_index”, “_type” : “test_type” , “_id” : 20,
“_retry_on_conflict” : 3 } }
{ “doc” : { “field_name” : “partial update field value” } }
{ “delete” : { “_index” : “test_index”, “_type” : “test_type”, “_id” : “2” } }
- 新增
注意事项
bulk语法中要求一个完整的json串不能有换行。不同的json串必须使用换行分隔。
多个操作中,如果有错误情况,不会影响到其他的操作,只会在批量操作返回结果中标记失败。
bulk语法批量操作时,bulk request会一次性加载到内存中,如果请求数据量太大,
性能反而下降(内存压力过高),需要反复尝试一个最佳的bulk request size。
一般从1000~5000条数据开始尝试,逐渐增加。如果查看bulk request size的话,
一般是5~15MB之间为好。
bulk语法要求json格式是为了对内存的方便管理,和尽可能降低内存的压力。
如果json格式没有特殊的限制,Elasticsearch在解释bulk请求时,需要对任意格式的json进行解释处理,
需要对bulk请求数据做json对象会json array对象的转化,那么内存的占用量至少翻倍,
当请求量过大的时候,对内存的压力会直线上升,且需要jvm gc进程对垃圾数据做频繁回收,
影响Elasticsearch效率。
生产环境中,bulk api常用。
都是使用java代码实现循环操作。一般一次bulk请求,执行一种操作。如:批量新增10000条数据等。
SearchRequestBuilder
- QUERY_THEN_FETCH
- QUERY_AND_FETCH
- DFS_QUERY_THEN_FETCH 多了一个一个初始的散射 更准确 效率更低
- DFS_QUERY_AND_FETCH 多了一个一个初始的散射 更准确 效率更低
- COUNT 只计算结果的数量
- SCAN 在执行了没有进行任何排序的检索时执行浏览
QueryBuilders
是es中提供的一个查询接口, 可以对其进行参数设置来进行查询
- 单个字段
termQuery(String name, String value) 完全匹配
termsQuery(String name, String… values) 一次匹配多个值 - 匹配多个字段 multiMatchQuery(Object text, String… fieldNames)
- 组合查询
and must
not mustNot
should or - 前缀查询
matchQuery - 范围查询
rangeQuery(String name) - 嵌套查询, 内嵌文档查询
nestedQuery(String path, QueryBuilder query, ScoreMode scoreMode) - boll查询
and must
not mustNot
or should
filter 返回的文档必须满足filter子句的条件。但是不会像Must一样,参与计算分值 - 只过滤文档中存在字段的筛选器
existsQuery(String name) - 用指定的正则表达式匹配包含术语的文档的查询
regexpQuery(String name, String regexp)