浅学ElasticSearch分布式全文搜索引擎

1.认识

1.1 引言

ElasticSearch是一款基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTFULweb接口。

Lucene是一款十分优秀的引擎库。

  • 优点
    性能好,功能全
  • 缺点
    配置使用复杂
    不支持集群

1.2 ElasticSearch

为了弥补原生Lucene的不足,ElasticSearch应运而生

ElasticSearch使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTfulAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。

ElasticSearch的特点:
1.使用比lucene更简单
2.支持集群,支持分布式
3.支持json操作
4.支持大型全文检索
5.通过Restfull风格来操作
特点体现:
(1)分布式的实时文件存储,每个字段都被索引并可被搜索
(2)分布式的实时分析搜索引擎
(3)可以扩展到上百台服务器,处理PB级结构化或非结构化数据
(4)高度集成化的服务,可以通过简单的 RESTful API、各种语言的客户端甚至命令行与之交互。

1.3 类似框架:

Solr(重量级对手)

Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr4 还增加了NoSQL支持。

Solr和ES比较:

  • Solr 利用 Zookeeper 进行分布式管理,支持更多格式的数据(HTML/PDF/CSV),官方提供的功能更多在传统的搜索应用中表现好于 ES,但实时搜索效率低
  • ES自身带有分布式协调管理功能,但仅支持json文件格式,本身更注重于核心功能,高级功能多有第三方插件提供,在处理实时搜索应用时效率明显高于 Solr

② Katta

大型公司 才使用大数据 比如bat
基于 Lucene 的,支持分布式,可扩展,具有容错功能,准实时的搜索方案。
优点:开箱即用,可以与 Hadoop 配合实现分布式。具备扩展和容错机制。
缺点:只是搜索方案,建索引部分还是需要自己实现。在搜索功能上,只实现了最基本的需求。成功案例较少,项目的成熟度稍微差一些。

③ HadoopContrib

Hadoop–大数据 分布式文件存储–日志分析–运营分析
Map/Reduce --分布式计算框架 模式的,分布式建索引方案,可以跟 Katta 配合使用。
Hive – mysql -->highchart
优点:分布式建索引,具备可扩展性。
缺点:只是建索引方案,不包括搜索实现。工作在批处理模式,对实时搜索的支持不佳。

2.ES安装及使用说明

2.1 安装

① 下载ES安装包
官方下载地址:https://www.elastic.co/downloads/elasticsearch
② 运行ES
bin/elasticsearch.bat
③ 验证
访问:http://localhost:9200/

ES安装与启动

2.2 ES交互方式

(1)基于RESTful API

ES和所有客户端的交互都是使用JSON格式的数据.
其他所有程序语言都可以使用RESTful API,通过9200端口的与ES进行通信,在开发测试阶段,我们可以使用喜欢的WEB客户端, curl命令以及火狐的POSTER插件方式和ES通信。

(2)Java API
ES为Java用户提供了两种内置客户端。

  • 节点客户端(node client):

节点客户端以无数据节点(none data node)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。

  • 传输客户端(Transport client):

这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。
两个Java客户端都通过9300端口与集群交互,使用ES传输协议(ES Transport Protocol)。集群中的节点
之间也通过9300端口进行通信。如果此端口未开放,你的节点将不能组成集群。

注意
Java客户端所在的ES版本必须与集群中其他节点一致,否则,它们可能互相无法识别。

2.3 Restful认识

Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。

GET /user/1 表示获取1这个用户 
DELETE /user/1 删除一个用户
PUT/POST /user/1 新增或者修改一个用户

使用名词来指定资源

GET http://api.dieu.cn/emp/3: 获取3号员工的基本资料;
GET http://api.dieu.cn/emps: 获取所有员工资料列表;

URI 中不要出现动词
duibi
左边的这种设计,很明显不符合REST风格,URI 只负责准确无误的暴露资源,而 getGirls已经包含了对资源的操作,这是不对的。相反右边却满足了,它的操作是使用标准的HTTP动词来体现。

通过HTTP动词来实现资源的状态扭转
GET 用来获取资源,
POST 用来新建资源(也可以用于更新资源),
PUT 用来更新资源,
DELETE 用来删除资源。

GET http://api.dieu.cn/emp/3 获取一个员工
POST http://api.dieu.cn/emp/2: 添加或修改一个员工
PUT http://api.dieu.cn/emp: 修改员工资料
DELETE http://api.dieu.cn/emp/3: 删除3号员工

2.4 辅助管理工具Kibana

2.4.1 安装启动

① Kibana5.2.2下载地址:https://www.elastic.co/downloads/kibana
② 解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES
③ 启动Kibana5 : bin\kibana.bat
④ 默认访问地址:http://localhost:5601

成功启动界面
启动界面

2.4.2 功能介绍

功能
Discover:可视化查询分析器
Visualize:统计分析图表
Dashboard:自定义主面板(添加图表)
Timelion:Timelion是一个kibana时间序列展示组件
Dev Tools :Console(同CURL/POSTER,操作ES代码工具,代码提示,很方便)
Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性。

3.ES数据管理

3.1 ES文档

ES是面向文档(document oriented)的,它在存储对象或文档的过程中,会索引每个文档;故在ES中,可以通过索引对文档(乘行成列的数据除外)进行搜索,排序,过滤。

ES使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式

ES文档中不只有数据,还包含元数据。
三个必需元数据
必需元数据

3.2 ES文档的增删改查

相关参数
参数1
参数2

3.2.1 创建文档

#①使用自己的id创建,PUT与POST均可
PUT dieu/heroes/1
{
  "name":"vn",
  "type":"adc",
  "sex":"female",
  "age":24
}

POST dieu/heroes/2
{
  "name":"luccian"
}
#②使用ES内置id创建,使用POST
POST dieu/heroes/
{
  "name":"zed"
}

3.2.2 获取文档

#①获取指定id文档
GET dieu/heroes/1
#②返回文档部分字段
GET dieu/heroes/1?_source=name,type
#③只返回文档内容,不要元数据
GET dieu/heroes/1/_source

3.2.3 修改文档

#①更新整个文档,同PUT _index/_type/_id,响应中_version的值增加,_created的值为false。
#created标识为false——因为同索引、同类型下已经存在同ID的文档。
PUT dieu/heroes/1
{
  "name":"vn",
  "type":"adc",
  "sex":"female",
  "age":24
}
#②局部更新文档
POST dieu/heroes/1/_update
{
  "doc": {
     "age":23
  }
}
#③脚本更新文档
POST dieu/heroes/1/_update
{
  "script":"dieu._source.age += 5"
}

3.2.4 删除文档

DELETE dieu/heroes/2

3.2.5 批量插入

POST _bulk
{"delete":{"_index":"dieu","_type":"heroes","_id":"1"}}
{"create":{"_index":"dieu","_type":"heroes","_id":"1"}}
{ "title": "lol" }
{ "index": { "_index": "dieu", "_type": "heroes" }}
{ "title": "LOL" }

3.2.6 批量获取

#①方式一
GET _mget
{
  "docs":[{
      "_index":"dieu",
      "_type":"heroes",
      "_id":"1"
    },{
       "_index":"dieu",
      "_type":"heroes",
      "_id":"AWpdn6PKczgRX2jIrRjX",
      "_source":"title"
      
    }]
}
#②方式二
GET dieu/heroes/_mget
{
  "ids":["1","AWpdn6PKczgRX2jIrRjX"]
}

3.2.7 分页查询

GET _search?size=3&from=2;
GET dieu/heroes/_search?q=age:23
GET dieu/heroes/_search?q=age[10 TO 30]

3.2.8 DSL查询与过滤

GET dieu/heroes/_search
{
  "query":{
    "bool": {
      "must": [
        {"match": {
          "sex": "male"
        }}
      ],
      "filter": [{
        "term":{
          "type":"sup"
        }
      },{
        "range":{
          "age":{
            "gte":"30",
            "lte":"300000"
          }
        }
      }]
    }
  },
  "from": 1, 
  "size": 5,
  "_source": ["id", "name", "type","sex","age"],
  "sort": [{"age": "desc"}]
  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值