Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速 度去处理大规模数据。ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分 布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发 的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用 于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
RestApi和Head插件操作Elasticsearch使用非java方式操作 ,端口9200
SpringDataElasticsearch 采用java方式 端口9300
数据库同步: 通过logstash完成mysql与Elasticsearch同步工作
1.Elasticsearch与MySQL数据库逻辑结构概念的对比
Elasticsearch | 关系型数据库Mysql |
索引(index) | 数据库(databases) |
类型(type) | 表(table) |
文档(document) | 行(row) |
2.下载与启动
下载ElasticSearch 5.6.8版本
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-5-6-8
启动: 在命令提示符下,进入ElasticSearch安装目录下的bin目录,执行命令
elasticsearch
即可启动。
我们打开浏览器,在地址栏输入http://127.0.0.1:9200/ 即可看到输出结果
elasticsearch
{
name: "zbKmjZZ",
cluster_name: "elasticsearch",
cluster_uuid: "W63nSobSRfKSLrrjuHXvzg",
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"
}
3.相关操作(Restful风格)
a.创建索引库
postman以PUT方式请求 127.0.0.1:9200/tensquare_elasticsearch
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "tensquare_elasticsearch"
}
b.创建文档
postman 以post方式请求 127.0.0.1:9200/tensquare_elasticsearch/article
{
"_index": "tensquare_elasticsearch",
"_type": "article",
"_id": "AWjshO2_gWUztPUP5aDv",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
c.查询全部索引库索引
GET方式提交 127.0.0.1:9200/tensquare_elasticsearch/article/_search
d.更新索引或者新建索引同方法
PUT方式提交
更新操作:127.0.0.1:9200/tensquare_elasticsearch/article/ + 已经存在的id 进行更新操作
新增操作:127.0.0.1:9200/tensquare_elasticsearch/article/ + 不存在的id 进行新增操作
e.根据id做查询 127.0.0.1:9200/tensquare_elasticsearch/article/1
GET 条件查询 127.0.0.1:9200/tensquare_elasticsearch/article/_search?q=title:教程
127.0.0.1:9200/tensquare_elasticsearch/article/_search?q=content:项目 此处会有模糊查询
f.删除操作
DELETE 操作 127.0.0.1:9200/tensquare_elasticsearch/article/1
4.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的项目构建工具。它可以自动运行你所 设定的任务
npm install ‐g grunt‐cli
步骤5:安装依赖 需要在head-master对应的package.json文件同一级执行
cnpm install
步骤6:
进入head目录启动head,在命令提示符下输入命令
grunt server
步骤7: 打开浏览器,输入 http://localhost:9100
步骤8:
点击连接按钮没有任何相应,按F12发现有如下错误
No 'Access-Control-Allow-Origin' header is present on the requested resource
这个错误是由于elasticsearch默认不允许跨域调用,而elasticsearch-head是属于前端工 程,所以报错。
我们这时需要修改elasticsearch的配置,让其允许跨域访问。
修改elasticsearch配置文件:[D:\software\elasticsearch-5.6.8\config]
elasticsearch.yml,增加以下两句命令:
http.cors.enabled: true
http.cors.allow‐origin: "*"
此步为允许elasticsearch跨越访问 点击连接即可看到相关信息
head插件的使用
(1) 数据浏览为查询操作功能
复合查询为增删改操作功能
(2)新增和更改操作: 获取索引,获取类型,然后在符合查询功能中进行操作
PUT操作进行更新和修改操作:拼接路径
5.ik分词器
(a)分词了解
http://127.0.0.1:9200/_analyze? analyzer=chinese&pretty=true&text=我是程序员
注:_analyze 分词
analyzer 分词器名称
(b)安装并重启elasticsearch https://github.com/medcl/elasticsearch-analysis-ik/releases 下载5.6.8版 本
解压后放到该路径 D:\software\elasticsearch-5.6.8\plugins ,放到es路径的plugins目录下面
IK 提供了两个分词算法ik_smart 和ik_max_word
其中ik_smart为最少切分,ik_max_word为最细粒度划分
实例1:最少切分 ik_smart
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:最细粒度切分 ik_max_word
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
}
]
}
(c)自定义词库
向ik分词器中添加分词词条:秦时明月
步骤: 进入elasticsearch/plugins/ik/config 目录
新建自定义dic文件 custom.dic,编辑内容
向custom.dic中添加词条,第一行需要设置空格,兼容各种环境
在IKAnalyzer.cfg.xml添加自定义词条的目录
重启 elasticsearch
127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=秦时明月
{
"tokens" : [
{
"token" : "秦时明月",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "明月",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 1
}
]
}
启动本地的es ,访问 http://localhost:9200/
启动本地的head插件 http://localhost:9100/
一:初步了解
1.pom.xml引入依赖
org.springframework.data
spring‐data‐elasticsearch
2.application.xml
server:
port: 9007
spring:
application:
name: tensquare‐search #指定服务名
data:
elasticsearch:
cluster‐nodes: 127.0.0.1:9300
3.创建索引实体类
@Data @EqualsAndHashCode(callSuper = false) @Document(indexName = "tensquare_article",type = "article") public class Article implements Serializable { @Id private Integer 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; }
4.dao层依旧遵循
public interface ArticleDao extends ElasticsearchRepository
{ }
5.索引的新增和查询
@RestController
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
@RequestMapping(method = RequestMethod.POST)
public Result addArticle(@RequestBody Article article){
articleService.save(article);
return new Result(true,StatusCode.OK,"新建索引成功");
}
@RequestMapping(value = "/{key}/{page}/{size}",method = RequestMethod.GET)
public Result findByTitleOrContent (@PathVariable String key,@PathVariable int page,@PathVariable int size) {
Page pageable = articleService.findByTitleOrContent(key,page,size);
return new Result(true,StatusCode.OK,"查询成功",new PageResult(pageable.getTotalElements(),pageable.getContent()));
}
}
一.什么是logstash
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集 起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。
二.Windows:logstash同步数据到索引库中
1.解压logstash-5.6.8到 D:\software\logstash-5.6.8,拷贝mysqletc到D:\software\logstash-5.6.8
2.解压进入bin目录 logstash ‐e 'input { stdin { } } output { stdout {} }'
当前输入和输入无内容,后续会把数据库的内容输入到索引库,实现数据库和索引库的同步操作
3.mysql同步到es中步骤
a.将mysqletc粘贴到该路径 D:\software\elasticsearch-5.6.8\mysqletc
b.修改mysql.conf
input {
jdbc {
# mysql jdbc connection string to our backup databse
jdbc_connection_string => "jdbc:mysql://192.168.1.105:3306/tensquare_article?characterEncoding=UTF8"
# the user we wish to excute our statement as
jdbc_user => "root"
jdbc_password => "123456"
# the path to our downloaded jdbc driver
jdbc_driver_library => "D:\software\elasticsearch-5.6.8\mysqletc\mysql-connector-java-5.1.46.jar"
# the name of the driver class for mysql
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50"
#以下对应着要执行的sql的绝对路径。
#statement_filepath => ""
statement => "select id,title,content,state from tb_article"
#定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
schedule => "* * * * *"
}
}
output {
elasticsearch {
#ESIP地址与端口
hosts => "127.0.0.1:9200"
#ES索引名称(自己定义的)
index => "tensquare_article"
#自增ID编号
document_id => "%{id}"
document_type => "article"
}
stdout {
#以JSON格式输出
codec => json_lines
}
}
c.bin命令行下执行 logstash ‐f ../mysqletc/mysql.conf
执行时间间隔:一分钟一次,同步成功后会将mysql数据同步到索引库
input {
jdbc {
# mysql jdbc connection string to our backup databse
jdbc_connection_string => "jdbc:mysql://192.168.1.105:3306/tensquare_article?characterEncoding=UTF8"
# the user we wish to excute our statement as
jdbc_user => "root"
jdbc_password => "123456"
# the path to our downloaded jdbc driver
jdbc_driver_library => "D:/software/logstash-5.6.8/mysqletc/mysql-connector-java-5.1.46.jar"
# the name of the driver class for mysql
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50"
#以下对应着要执行的sql的绝对路径。
#statement_filepath => ""
statement => "select id,title,content,state from tb_article"
#定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
schedule => "* * * * *"
}
}
output {
elasticsearch {
#ESIP地址与端口
hosts => "127.0.0.1:9200"
#ES索引名称(自己定义的)
index => "tensquare_article"
#自增ID编号
document_id => "%{id}"
document_type => "article"
}
stdout {
#以JSON格式输出
codec => json_lines
}
}
注意:mysql删除数据后,索引库并不会消失,所以mysql需要维护state进行状态的同步,表示已删除
三.linux : logstash同步数据到索引库中
1.docker 安装elasticsearch
docker run -di --name=tensquare_elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8
2.在postman先通过put提交请求
192.168.1.105:9200/tensquare_article 生成一个tensquare_article索引库
3.通过本地请求 127.0.0.1/article post请求,但是报如下错误:无法远程访问
{
"timestamp": "2019-02-17T08:39:54.039+0000",
"status": 500,
"error": "Internal Server Error",
"message": "None of the configured nodes are available: [{#transport#-1}{nTimF_t5Q0O7PJwrbcPjiw}{192.168.1.105}{192.168.1.105:9300}]",
"path": "/article"
}
解决方法:
a.进入容器
docker exec ‐it tensquare_elasticsearch /bin/bash
b.拷贝配置文件到宿主机
docker cp tensquare_elasticsearch:/usr/share/elasticsearch/config/elasticsearch.yml /usr/share/elasticsearch.yml
c.关闭并删除原es容器
docker stop tensquare_elasticsearch
docker rm tensquare_elasticsearch
d.以配置文件启动
docker run -di --name=tensquare_es -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:5.6.8
e.)修改/usr/share/elasticsearch.yml 将 transport.host: 0.0.0.0 前的#去掉后保 存文件退出。其作用是允许任何ip地址访问elasticsearch .开发测试阶段可以这么做,生产环境下指定具体的IP
但是重启会报错,因为配置之后需要更多的软硬件
*** 系统调优
第一步:修改软硬件:修改/etc/security/limits.conf ,追加内容
* soft nofile 65536
* hard nofile 65536
第二步:修改访问数:nofile是单个进程允许打开的最大文件个数 soft nofile 是软限制 hard nofile是硬限制
修改/etc/sysctl.conf,追加内容
vm.max_map_count=655360
第三步:重新启动虚拟机,再次启动容器,发现已经可以启动并远程访问
4.访问127.0.0.1:9007/article 添加
查询全部
更新操作
http://192.168.1.105:9200/_analyze?analyzer=chinese&pretty=true&text=我是程序员
http://192.168.1.105:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
http://192.168.1.105:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员
访问时
安装ik分词器
1.进入容器 docker exec -it tensquare_es /bin/bash,获取plugins路径 /usr/share/elasticsearch/plugins
2.拷贝ik到容器plugins中
docker cp ik.zip tensquare_es:/usr/share/elasticsearch/plugins/
3.重启es容器
1.进入/usr/share,修改elasticsearch.xml
http.cors.enabled: true
http.cors.allow‐origin: "*"
2.创建head容器
docker run ‐di ‐‐name=myhead ‐p 9100:9100 docker pull mobz/elasticsearchhead:5
3. 访问 192.168.1.105:9100