下表是Elasticsearch与MySQL数据库逻辑结构概念的对比
Elasticsearch 关系型数据库Mysql
索引(index) 数据库(databases)
类型(type) 表(table)
文档(document) 行(row)
下载ElasticSearch 5.6.8版本
https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-8
无需安装,解压安装包后即可使用
在命令提示符下,进入ElasticSearch安装目录下的bin目录,执行命令,即可启用
elasticsearch
9200,9300端口启动后,打开浏览器,在地址栏输入http://127.0.0.1:9200/ 即可看到输出结果
{
"name" : "uV2glMR",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RdV7UTQZT1‐Jnka9dDPsFg",
"version" : {
"number" : "5.6.8",
"build_hash" : "688ecce",
"build_date" : "2018‐02‐16T16:46:30.010Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
Postman调用RestAPI
####### 例如我们要创建一个叫articleindex的索引 ,就以put方式提交
http://127.0.0.1:9200/articleindex/
####### 新建文档
以post方式提交 http://127.0.0.1:9200/articleindex/article
body:
{
"name" : "uV2glMR",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RdV7UTQZT1‐Jnka9dDPsFg",
"version" : {
"number" : "5.6.8",
"build_hash" : "688ecce",
"build_date" : "2018‐02‐16T16:46:30.010Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
{
"title":"SpringBoot2.0",
"content":"发布啦"
}
返回结果如下:
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKsdh0FdLZnId5S_F9",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
查询全部文档
####### 查询某索引某类型的全部数据,以get方式请求
http://127.0.0.1:9200/articleindex/article/_search 返回结果如下:
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKsdh0FdLZnId5S_F9",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
2.2.4 修改文档
以put形式提交以下地址:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKrI4pFdLZnId5S_F7",
"_score": 1,
"_source": {
"title": "SpringBoot2.0",
"content": "发布啦"
}
},
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKsdh0FdLZnId5S_F9",
"_score": 1,
"_source": {
"title": "elasticsearch入门",
"content": "零基础入门"
}
}
]
}
}
修改文档 以put方式提交
http://192.168.184.134:9200/articleindex/article/AWPKrI4pFdLZnId5S_F7
body:
返回结果:
如果我们在地址中的ID不存在,则会创建新文档
以put形式提交以下地址:
http://192.168.184.134:9200/articleindex/article/1
body:
返回信息:
{
"title":"SpringBoot2.0正式版",
"content":"发布了吗"
}
{
"_index": "articleindex",
"_type": "article",
"_id": "AWPKsdh0FdLZnId5S_F9",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false
}
{
"title":"十次方课程好给力",
"content":"知识点很多"
}
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
再次查询,看是否有新增的这条文档
2.2.5 按ID查询文档
GET方式请求
http://192.168.184.134:9200/articleindex/article/1
2.2.6 基本匹配查询
根据某列进行查询 get方式提交下列地址:
http://192.168.184.134:9200/articleindex/article/_search?q=title:十次方课程
好给力
以上为按标题查询,返回结果如下:
{
"_index": "articleindex",
"_type": "article",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
按ID查询文档 GET方式请求
http://192.168.184.134:9200/articleindex/article/1
基本匹配查询 根据某列进行查询 get方式提交下列地址:
http://192.168.184.134:9200/articleindex/article/_search?q=title:十次方课程
好给力
按标题查询结果如下
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 2.0649285,
"hits": [
{
"_index": "articleindex",
"_type": "article",
"_id": "1",
"_score": 2.0649285,
"_source": {
"title": "十次方课程好给力",
"content": "知识点很多"
}
}
]
}
}
模糊查询 我们可以用*代表任意字符
http://192.168.184.134:9200/articleindex/article/_search?q=title:*s*
删除文档 根据ID删除文档,删除ID为1的文档 DELETE方式提交
http://192.168.184.134:9200/articleindex/article/1
返回结果如下:
{
"found": true,
"_index": "articleindex",
"_type": "article",
"_id": "1",
"_version": 2,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
}
}
Head插件的安装与使用
通过rest请求的方式使用Elasticsearch,未免太过麻烦,而且也不够人性化。我
们一般都会使用图形化界面来实现Elasticsearch的日常管理,最常用的就是Head插件
步骤1:
下载head插件:https://github.com/mobz/elasticsearch-head
配套资料中已提供。 elasticsearch-head-master.zip
步骤2:
解压到任意目录,但是要和elasticsearch的安装目录区别开。
步骤3:
安装node js ,安装cnpm
npm install ‐g cnpm ‐‐registry=https://registry.npm.taobao.org //如安装过,跳过
步骤4:
将grunt安装为全局命令 。Grunt是基于Node.js的项目构建工具。它可以自动运行你所
设定的任务
步骤5:安装依赖
cnpm install
步骤6:
进入head目录启动head,在命令提示符下输入命令
步骤7:
打开浏览器,输入 http://localhost:9100
步骤8:
点击连接按钮没有任何相应,按F12发现有如下错误
No 'Access-Control-Allow-Origin' header is present on the requested resource
这个错误是由于elasticsearch默认不允许跨域调用,而elasticsearch-head是属于前端工
程,所以报错。
我们这时需要修改elasticsearch的配置,让其允许跨域访问。
修改elasticsearch配置文件:elasticsearch.yml,增加以下两句命令:
此步为允许elasticsearch跨越访问 点击连接即可看到相关信息
npm install ‐g grunt‐cli
grunt server
http.cors.enabled: true
http.cors.allow‐origin: "*"
此步为允许elasticsearch跨越访问 点击连接即可看到相关信息
Head插件操作
新建索引
选择“索引”选项卡,点击“新建索引”按钮,输入索引名称点击OK
新建或修改文档
在复合查询中提交地址,输入内容,提交方式为PUT,点击数据浏览 ,点击要查询的索引名称,右侧窗格中显示文档信息
点击文档信息:
修改数据后重新提交请求 , 此时因为ID已经存在,所以执行的是修改操作。
重新查询此记录,发现版本为2 。也就是说每次修改后版本都会增加1.
删除文档
DELETE方式提交,带上ID号
IK分词器
我们在浏览器地址栏输入http://127.0.0.1:9200/_analyze?
analyzer=chinese&pretty=true&text=我是程序员,浏览器显示效果如下
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "",
"position" : 1
},
{
"token" : "程",
"start_offset" : 2,
"end_offset" : 3,
"type" : "",
"position" : 2
},
{
"token" : "序",
"start_offset" : 3,
"end_offset" : 4,
"type" : "",
"position" : 3
},
{
"token" : "员",
"start_offset" : 4,
"end_offset" : 5,
"type" : "",
"position" : 4
}
]
}
默认的中文分词是将每个字看成一个词,这显然是不符合要求的,所以我们需要安装中
文分词器来解决这个问题。
IK分词器安装
下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases 下载5.6.8版
本 课程配套资源也提供了: 资源\配套软件\elasticsearch\elasticsearch-analysis-ik-
5.6.8.zip
(1)先将其解压,将解压后的elasticsearch文件夹重命名文件夹为ik
(2)将ik文件夹拷贝到elasticsearch/plugins 目录下。
(3)重新启动,即可加载IK分词器
IK分词器测试
IK提供了两个分词算法ik_smart 和 ik_max_word
其中 ik_smart 为最少切分,ik_max_word为最细粒度划分
(1)最小切分:在浏览器地址栏输入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "程序员",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
}
]
}
(2)最细切分:在浏览器地址栏输入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序
员
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "程序员",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "程序",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "员",
"start_offset" : 4,
"end_offset" : 5,
"type" : "CN_CHAR",
"position" : 4
}
]
}
默认的分词并没有识别“传智播客”是一个词。如果我们想让系统识别“传智播客”是一个
词,需要编辑自定义词库。
步骤:
(1)进入elasticsearch/plugins/ik/config目录
(2)新建一个my.dic文件,编辑内容:
法师打发时光
修改IKAnalyzer.cfg.xml(在ik/config目录下)
IK Analyzer 扩展配置
my.dic
重新启动elasticsearch,通过浏览器测试分词效果
{
"tokens" : [
{
"token" : "传智播客",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 0
}
]
}
示列:搜索微服务开发
1,导入pom.xml依赖
org.springframework.data
spring‐data‐elasticsearch
com.tensquare
tensquare_common
1.0‐SNAPSHOT
2,application.yml
server:
port: 9007
spring:
application:
name: tensquare‐search #指定服务名
data:
elasticsearch:
cluster‐nodes: 127.0.0.1:9300
创建实体类
/**
* 文章实体类
*/
@Document(indexName="tensquare",type="article")
public class Article implements Serializable{
@Id
private String id;//ID
@Field(index= true
,analyzer="ik_max_word",searchAnalyzer="ik_max_word")
private String title;//标题
@Field(index= true
,analyzer="ik_max_word",searchAnalyzer="ik_max_word")
private String content;//文章正文
private String state;//审核状态
//getter and setter ......
}
controller
@RestController
@CrossOrigin
@RequestMapping("/article")
public class ArticleSearchController {
@Autowired
private ArticleSearchService articleSearchService;
@RequestMapping(method= RequestMethod.POST)
public Result save(@RequestBody Article article){
articleSearchService.save(article);
return new Result(true, StatusCode.OK, "操作成功");
}
}
ArticleSearchRepository新增方法定义 dao
/**
* 检索
* @param
* @return
*/
public Page findByTitleOrContentLike(String title, String
content, Pageable pageable);
ArticleSearchService新增方法
public Page findByTitleLike(String keywords, int page, int size)
{
PageRequest pageRequest = PageRequest.of(page‐1, size);
return
articleSearchRepository.findByTitleOrContentLike(keywords,keywords,
pageRequest);
}
ArticleSearchController方法
@RequestMapping(value="/search/{keywords}/{page}/{size}",method=
RequestMethod.GET)
public Result findByTitleLike(@PathVariable String keywords,
@PathVariable int page, @PathVariable int size){
Page articlePage =
articleSearchService.findByTitleLike(keywords,page,size);
return new Result(true, StatusCode.OK, "查询成功",
new PageResult(articlePage.getTotalElements(),
articlePage.getContent()));
}
elasticsearch与MySQL数据同步 Logstash
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集
起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。
解压,进入bin目录
logstash ‐e 'input { stdin { 输入什么} } output { stdout {输出什么} }'
stdin,表示输入流,指从键盘输入
stdout,表示输出流,指从显示器输出
命令行参数:
-e 执行
--config 或 -f 配置文件,后跟参数类型可以是一个字符串的配置或全路径文件名或全路径
路径(如:/etc/logstash.d/,logstash会自动读取/etc/logstash.d/目录下所有*.conf 的文
本文件,然后在自己内存里拼接成一个完整的大配置文件再去执行)
MySQL数据导入Elasticsearch
(1)在logstash-5.6.8安装目录下创建文件夹mysqletc (名称随意)
(2)文件夹下创建mysql.conf (名称随意) ,内容如下:
(3)将mysql驱动包mysql-connector-java-5.1.46.jar拷贝至D:/logstash-
5.6.8/mysqletc/ 下 。D:/logstash-5.6.8是你的安装目录
(4)命令行下执行
logstash ‐f ../mysqletc/mysql.conf
观察控制台输出,每间隔1分钟就执行一次sql查询。
再次刷新elasticsearch-head的数据显示,看是否也更新了数据。
Elasticsearch Docker环境下安装
(1)下载镜像 docker pull elasticsearch:5.6.8
(2)创建容器
docker run ‐di ‐‐name=tensquare_elasticsearch ‐p 9200:9200 ‐p 9300:9300
elasticsearch:5.6.8
(3)浏览器输入地址:http://192.168.184.134:9200/ 即可看到如下信息
{
"name" : "WmBn0H‐",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "2g‐VVbm9Rty7J4sksZNJEg",
"version" : {
"number" : "5.6.8",
"build_hash" : "688ecce",
"build_date" : "2018‐02‐16T16:46:30.010Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
(4) 修改demo的application.yml
spring:
data:
elasticsearch:
cluster‐nodes: 192.168.184.135:930
(5)运行测试程序,发现会报如下错误 这是因为elasticsearch从5版本以后默认不开启远程连接,需要修改配置文件
NoNodeAvailableException[None of the configured nodes are available:
[{#transport#‐1}{exvgJLR‐RlCNMJy‐hzKtnA}{192.168.184.135}
{192.168.184.135:9300}]
]
at
org.elasticsearch.client.transport.TransportClientNodesService.ensureNodes
AreAvailable(TransportClientNodesService.java:347)
at
org.elasticsearch.client.transport.TransportClientNodesService.execute(Tra
nsportClientNodesService.java:245)
at
org.elasticsearch.client.transport.TransportProxyClient.execute(TransportP
roxyClient.java:59)
(6) 进入容器 docker exec ‐it tensquare_elasticsearch /bin/bash
我们看到elasticsearch所在的目录为/usr/share/elasticsearch ,进入config看到了
配置文件 elasticsearch.yml 无法使用 vi进行编辑
(7)拷贝配置文件到宿主机
首先退出容器(将容器中的文件拷贝出去修改),然后执行命令:
docker cp
tensquare_elasticsearch:/usr/share/elasticsearch/config/elasticsearch.yml
/usr/share/elasticsearch.yml
(8)停止和删除原来创建的容器
docker stop tensquare_elasticsearch
docker rm tensquare_elasticsearch
(9)重新执行创建容器命令
docker run ‐di ‐‐name=tensquare_elasticsearch ‐p 9200:9200 ‐p 9300:9300 ‐v
/usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch
.yml elasticsearch:5.6.8
(10)修改/usr/share/elasticsearch.yml 将 transport.host: 0.0.0.0 前的#去掉后保
存文件退出。其作用是允许任何ip地址访问elasticsearch .开发测试阶段可以这么做,生
产环境下指定具体的IP
(11)重启启动 docker restart tensquare_elasticsearch
重启后发现重启启动失败了,这时什么原因呢?这与我们刚才修改的配置有关,因为
elasticsearch在启动的时候会进行一些检查,比如最多打开的文件的个数以及虚拟内存
区域数量等等,如果你放开了此配置,意味着需要打开更多的文件以及虚拟内存,所以
我们还需要系统调优。
(12)系统调优 修改/etc/security/limits.conf ,追加内容
* soft nofile 65536
* hard nofile 65536
nofile是单个进程允许打开的最大文件个数 soft nofile 是软限制 hard nofile是硬限制
修改/etc/sysctl.conf,追加内容
vm.max_map_count=655360
限制一个进程可以拥有的VMA(虚拟内存区域)的数量
执行下面命令 修改内核参数马上生效
sysctl ‐p
(13)重新启动虚拟机,再次启动容器,发现已经可以启动并远程访问
IK分词器安装
(1)快捷键alt+p进入sftp , 将ik文件夹上传至宿主机
(2)在宿主机中将ik文件夹拷贝到容器内 /usr/share/elasticsearch/plugins 目录下。
docker cp ik tensquare_elasticsearch:/usr/share/elasticsearch/plugins/
(3)重新启动,即可加载IK分词器
docker restart tensquare_elasticsearch
HEAD插件安装 (图形化操作界面)
(1)修改/usr/share/elasticsearch.yml ,添加允许跨域配置
http.cors.enabled: true
http.cors.allow‐origin: "*"
(2)重新启动elasticseach容器
(3)下载head镜像
docker pull mobz/elasticsearch‐head:5
(4)创建head容器
docker run ‐di ‐‐name=myhead ‐p 9100:9100 docker pull mobz/elasticsearch‐
head:5