Elasticsearch的使用

ES

ES是一个使用java语言编写的并且基于Lucene编写的搜索引擎, 他提供了分布式的全文搜索服务, 还提供了一个RESTful风格的web接口

参考文档

参考
elasticsearch 大数据场景下使用scroll实现分页查询

特点

  1. 分布式 横向
  2. 全文检索
  3. 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

  1. 新增

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功能多一个允许主键自动生成方式

  1. 查询

    1. GET
      索引名/类型名/唯一ID GET test_index/test_type/1
    2. GET _mget批量查询
      GET _mget
      {
      “docs” : [
      {
      “_index” : “索引名”,
      “_type” : “类型名”,
      “_id” : “唯一ID值”
      }, {}, {}
      ]
      }

    GET 索引名/_mget
    {
    “docs” : [
    {
    “_type” : “类型名”,
    “_id” : “唯一ID值”
    }, {}, {}
    ]
    }

    GET 索引名/类型名/_mget
    {
    “docs” : [
    {
    “_id” : “唯一ID值”
    },
    {
    “_id” : “唯一ID值”
    }
    ]
    }

    1. 查询全部
      GET 索引名/类型名/_search
  2. 修改

    1. 替换Document(全量替换)
      语法:PUT 索引名/类型名/唯一ID{字段名:字段值}

    注意事项
    本操作相当于覆盖操作。全量替换的过程中,Elasticsearch不会真的修改Document中的数据,而是标记Elasticsearch中原有的Document为deleted状态,
    再创建一个新的Document来存储数据,当Elasticsearch中的数据量过大时,Elasticsearch后台回收deleted状态的Document

    1. 更新Document
      语法:POST 索引名/类型名/唯一ID/_update{doc:{字段名:字段值}}

    注意事项
    只更新某Document中的部分字段。这种更新方式也是标记原有数据为deleted状态,创建一个新的Document数据,将新的字段和未更新的原有字段组成这个新的Document,并创建。
    对比全量替换而言,只是操作上的方便,在底层执行上几乎没有区别

  3. 删除

注意事项
Elasticsearch中执行删除操作时,Elasticsearch先标记Document为deleted状态,而不是直接物理删除。当Elasticsearch存储空间不足或工作空闲时,才会执行物理删除操作。
标记为deleted状态的数据不会被查询搜索到
语法:DELETE 索引名/类型名/唯一ID

  1. 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: 删除操作

    1. 新增
      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” }
    2. 更新
      POST _bulk
      { “update” : { “_index” : “test_index”, “_type” : “test_type” , “_id” : 2, “_retry_on_conflict” : 3 } }
      { “doc” : { “field_name” : “partial update field value” } }
    3. DELETE
      POST _bulk
      { “delete” : { “_index” : “test_index”, “_type” : “test_type”, “_id” : “2” } }
    4. 批量写
      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

  1. QUERY_THEN_FETCH
  2. QUERY_AND_FETCH
  3. DFS_QUERY_THEN_FETCH 多了一个一个初始的散射 更准确 效率更低
  4. DFS_QUERY_AND_FETCH 多了一个一个初始的散射 更准确 效率更低
  5. COUNT 只计算结果的数量
  6. SCAN 在执行了没有进行任何排序的检索时执行浏览

QueryBuilders

是es中提供的一个查询接口, 可以对其进行参数设置来进行查询

  1. 单个字段
    termQuery(String name, String value) 完全匹配
    termsQuery(String name, String… values) 一次匹配多个值
  2. 匹配多个字段 multiMatchQuery(Object text, String… fieldNames)
  3. 组合查询
    and must
    not mustNot
    should or
  4. 前缀查询
    matchQuery
  5. 范围查询
    rangeQuery(String name)
  6. 嵌套查询, 内嵌文档查询
    nestedQuery(String path, QueryBuilder query, ScoreMode scoreMode)
  7. boll查询
    and must
    not mustNot
    or should
    filter 返回的文档必须满足filter子句的条件。但是不会像Must一样,参与计算分值
  8. 只过滤文档中存在字段的筛选器
    existsQuery(String name)
  9. 用指定的正则表达式匹配包含术语的文档的查询
    regexpQuery(String name, String regexp)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值