1、ES介绍
elasticsearch(简称ES)是一个建立在Apache Lucene上的搜索引擎
ES功能特征:
(1)分布式近实时(从一个文档开始索引到能搜索到延迟1s左右)文件存储,并为每个字段建立索引,方便搜索
(2)实时分析的分布式搜索引擎
(3)可以扩展到上百台机器,处理PB级别的结构化或非结构化数据
2、ES基础概念
(1)域(Field):对应MySQL中的列
(2)文档(Document):对应MySQL中的行
(3)类型(Type):对应MySQL中的表格
(4)索引(名词):对应MySQL中的数据库
(5)索引(动词):将Document存储在索引中
(6)反向索引:每一个字段都会被创建一个反向索引,类似于MySQL中的字段索引
(7)分片:
分片背景:由于硬件存在限制,单个节点可能容纳不了完整索引,例如某个索引包含十几亿的文档,如果机器硬盘只有几百G,可能存储不了
什么是分片:将单个索引细分为片段存储到不同的节点(机器)上,这些片段叫做分片。
如何指定分片:在创建索引时,可以指定需要的分片数量
机制透明:分片分发的机制,以及它的文档如何汇总到搜索请求中完全由elasticsearch
来管理,并且对于用户来说是透明的
3、ES与MySQL比较
(1)MySQL是基于行与列的关系型数据库,ES是面向文档型数据库
(2)ES不仅存储文档,还为文档建立索引,在此基础上可以检索、排序、过滤文档
ES为每个Document的每个Field建立(反向)索引
4、ES基本操作
(1)启动
----普通方式启动
命令行:{ES_HOME}/bin/elasticsearch
----以后台服务方式启动
命令行:{ES_HOME}/bin/elasticsearch -d
(2)停止
先查询elasticsearch进程ID:jps | grep elasticsearch
结束对应进程:kill -9 pid
(3)清空索引
5、ES存储结构图解
6、客户端如何与ES通信
(1)Java客户端
Elasticsearch 内置了两个客户端:
节点客户端: 节点客户端以一个 无数据节点 的身份加入了一个集群。换句话说,它自身是没有任何数据的,但是他知道什么数据在集群中的哪一个节点上,然后就可以请求转发到正确的节点上并进行连接。
传输客户端: 更加轻量的传输客户端可以被用来向远程集群发送请求。他并不加入集群本身,而是把请求转发到集群中的节点。
协议端口:使用 Elasticsearch 的 传输 协议,通过9300端口与 java 客户端进行通信。集群中的各个节点也是通过9300端口进行通信。如果这个端口被禁止了,那么你的节点们将不能组成一个集群
注意事项:Java 的客户端的版本号必须要与 Elasticsearch 节点所用的版本号一样,不然他们之间可能无法识别
(2)非Java客户端
通过HTTP向RESTful API传送json,具体是通过9200端口与 Elasticsearch 的 RESTful API 进行通信
(3)Java REST Client
------Java Low Level Rest Client
------Java High Level Rest Client
7、使用ES搜索
(1)使用ID检索(指定字段准确检索,相当于指定了_id=xxx)
GET /megacorp/employee/1
(2)使用简易检索
GET /megacorp/employee/_search
(3)使用带参数简易检索(指定字段准确检索,即检索只会针对last_name字段中的内容)
GET /megacorp/employee/_search?q=last_name:Smith
(4)使用Query DSL检索
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
(5)使用带过滤器的搜索
GET /megacorp/employee/_search
{
"query" : {
"filtered" : {
"filter" : {
"range" : {
"age" : { "gt" : 30 } <1>
}
},
"query" : {
"match" : {
"last_name" : "Smith" <2>
}
}
}
}
}
(6)使用全文检索
---文档在被索引时,除了对每个字段的内容建立索引之外,还会自动将所有字段的内容拼接成一个_all字段,然后对这个_all字段的内容建立索引
---客户端没有指定【明确】字段进行检索,则默认是检索_all字段
---为了【更加智能】应对客户端检索需求,对_all字段建立索引时会使用一些小技巧:例如将dogs处理成dog、jump和leap等价........
---全文检索时,客户端的Query String同样会使用与建立索引时使用的Tokenizer进行分词后再触发检索
---全文检索自动对不同文档的检索匹配次数进行排序,形成一个相关度指标
(7)使用段落检索
(8)高亮检索结果
(9)mget批量检索
(10)设定_source指定返回字段
(11)Bulk批量执行多个请求(create、index、delete、update)
参考:http://www.learnes.net/getting_started/tutorial_search.html
----------------------------------------------------------------Windows下安装使用ES---------------------------------------------------------------------------------
1、 下载elasticsearch-2.3.5.zip
2、 启动:
切换目录:cd E:\elasticsearch-2.3.5\bin
运行:elasticsearch.bat
3、 安装ElasticSearchHead插件
切换目录:cd E:\elasticsearch-2.3.5\bin
运行:plugin install mobz/elasticsearch-head
4、 Elasticsearch CRUD客户端Sense(不支持中文)
URL格式:http://localhost:9200/<index>/<type>/[<id>]
其中index、type是必须提供的;
id是一条数据(文档)的唯一标识,如果重复 则覆盖已经存在的;
index、type将信息进行分层,利于管理。index可以理解为数据库,type理解为数据表
5、 Sense操作
(1) 添加
PUT /gag_user/person/3
{
"name":"lisi",
"age": 30,
"intro": "productmanager"
}
注意:PUT需要顶头写,json字段名称需要加引号
(2) 修改/覆盖
操作同添加一样,只是修改需要将id置为和存在的记录一致
(3) 删除
DELETE /gag_user/person/4
{
"name":"liup",
"age": 29,
"intro": "javaprogrammer"
}
(4) 查询
查询所有库,所有表的文档
GET/_search
{
"query": { "match_all":{} }
}
查询指定库指定表的一条文档
GET /gag_user/person/2
在所有库所有表中查找某个字段等于某个值的文档
GET/_search
{
"query": {
"query_string": {"query": "lisi" }
}
}
在指定库指定表中查找某个字段等于某个值的文档
POST /gag_user/person/_search
{
"query": {
"query_string": {"query": "wangwu" }
}
}
在指定库指定表中查找指定个字段等于某个值的文档
POST /gag_user/person/_search
{
"query": {
"query_string": {
"fields": ["age"],
"query": 30
}
}
}
多条件并列条件查询
POST /gag_user/person/_search
{
"query": {
"filtered": {
"filter": {
"term": {
"age": 30
}
}
}
}
}
(5) 更多操作参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
6、 Elasticsearch Head插件
基本查询和复合查询也可以完成基本的CRUD操作
7、 Kibana可以专门用来查看ElasticSearch内容的工具,并且可以图形化
8、 搜索引擎相关理论