Elasticsearch

1. Elasticsearch 安装
(1)docker镜像下载
docker pull elasticsearch:5.6.8
(2)安装es容器
docker run -di --name=elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8
9200端口(Web管理平台端口) 9300(服务默认端口)
浏览器输入地址访问:http://192.168.xxx.xxx:9200/
(3)开启远程连接
上面完成安装后,es并不能正常使用,elasticsearch从5版本以后默认不开启远程连接,程序直接连接会报如下错误:
failed to load elasticsearch nodes : org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{5ttLpMhkRjKLkvoY7ltUWg}{192.168.xxx.xxx}{192.168.xxx.xxx:9300}]
我们需要修改es配置开启远程连接,代码如下:
登录容器
$ docker exec -it changgou_elasticsearch /bin/bash
修改elasticsearch.yml文件
$ vi /usr/share/elasticsearch/config/elasticsearch.yml
若vi命令无法识别,安装vim编辑器
$ apt-get update
$ apt-get install vim
安装好了后,修改elasticsearch.yml配置,如下:
http.host: 0.0.0.0
# Uncomment the following lines for a production cluster deployment
transport.host: 0.0.0.0
#discovery.zen.minimum_master_nodes: 1
cluster.name: my-application #此行需要添加,用于项目配置文件
http.cors.enabled: true #跨域配置
http.cors.allow-origin: "*" #跨域配置
network.host: 192.168.xxx.xxx #跨域配置
其中:
http.cors.enabled: true:此步为允许elasticsearch跨域访问,默认是false。
http.cors.allow-origin: "":表示跨域访问允许的域名地址(表示任意)。
重启docker
$ docker restart elasticsearch
(4)系统参数配置
重启后发现重启启动失败了,这时什么原因呢?这与我们刚才修改的配置有关,因为elasticsearch在启动的时候会进行一些检查,比如最多打开的文件的个数以及虚拟内存区域数量等等,如果你放开了此配置,意味着需要打开更多的文件以及虚拟内存,所以我们还需要系统调优
修改vi /etc/security/limits.conf ,追加内容 (nofile是单个进程允许打开的最大文件个数 soft nofile 是软限制 hard nofile是硬限制 )
* soft nofile 65536
* hard nofile 65536
修改vi /etc/sysctl.conf,追加内容 (限制一个进程可以拥有的VMA(虚拟内存区域)的数量 )
vm.max_map_count=655360
执行下面命令 修改内核参数马上生效
$ sysctl -p
重新启动虚拟机,再次启动容器,发现已经可以启动并远程访问
$ reboot
小提示:如果想让容器开启重启,可以执行下面命令
$ docker update --restart=always 容器名称或者容器id
2. IK分词器安装
(1)安装ik分词器
IK分词器下载地址https://github.com/medcl/elasticsearch-analysis-ik/releases
将ik分词器上传到服务器上,然后解压,并改名字为ik
$ unzip elasticsearch-analysis-ik-5.6.8.zip
$ mv elasticsearch ik
将ik目录拷贝到docker容器的plugins目录下
$ docker cp ./ik elasticsearch:/usr/share/elasticsearch/plugins
(2)IK分词器测试
访问:http://192.168.211.132:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
访问:http://192.168.211.132:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员
3. Kibana使用-掌握DSL语句
我们上面使用的是elasticsearch-head插件实现数据查找的,但是elasticsearch-head的功能比较单一,我们这里需要一个更专业的工具实现对日志的实时分析,也就是我们接下来要讲的kibana。
Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
Kibana 可以使大数据通俗易懂。它很简单,基于浏览器的界面便于您快速创建和分享动态数据仪表板来追踪 Elasticsearch 的实时数据变化。
搭建 Kibana 非常简单。您可以分分钟完成 Kibana 的安装并开始探索 Elasticsearch 的索引数据 — 没有代码、不需要额外的基础设施。
3.1 Kibana下载安装
直接使用Docker
(1)镜像下载
$ docker pull docker.io/kibana:5.6.8
(2)安装kibana容器
执行如下命令,开始安装kibana容器
$ docker run -it -d -e ELASTICSEARCH_URL=http://192.168.xxx.xxx:9200 --name kibana --restart=always -p 5601:5601 kibana:5.6.8
ELASTICSEARCH_URL=http://192.168.xxx.xxx:9200:是指链接的ES地址
restart=always:每次服务都会重启,也就是开启启动
5601:5601:端口号
(3)访问测试
访问http://192.168.xxx.xxx:5601
3.2 Kibana使用
3.2.1 配置索引
要使用Kibana,您必须至少配置一个索引。索引用于标识Elasticsearch索引以运行搜索和分析。它们还用于配置字段。
选择 Management
-> index Patterns
我们修改索引名称的匹配方式即可。点击create,会展示出当前配置的索引的域信息。
3.2.2 数据搜索
Discover为数据搜索部分,可以对日志信息进行搜索操作。
可以使用Discover实现数据搜索过滤和搜索条件显示以及关键词搜索。
3.2.3 DSL语句使用
介绍
Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句。采用API代替传统的拼接字符串来构造查询语句。目前Querydsl支持的平台包括JPA,JDO,SQL,Java Collections,RDF,Lucene,Hibernate Search。elasticsearch提供了一整套基于JSON的查询DSL语言来定义查询。
Query DSL当作是一系列的抽象的查询表达式树(AST)特定查询能够包含其它的查询,(如 bool ), 有些查询能够包含过滤器(如 constant_score), 还有的可以同时包含查询和过滤器 (如 filtered). 都能够从ES支持查询集合里面选择任意一个查询或者是从过滤器集合里面挑选出任意一个过滤器, 这样的话,我们就可以构造出任意复杂(maybe 非常有趣)的查询了。
索引操作
(1)查询所有索引
GET /_cat/indices?v
(2)删除某个索引
DELETE /skuinfo
(3)新增索引
PUT /user
(4)创建映射
PUT /user/userinfo/_mapping
{
"properties": {
"name":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart",
"store": false
},
"city":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart",
"store": false
},
"age":{
"type": "long",
"store": false
},
"description":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart",
"store": false
}
}
}
(5)新增文档数据
PUT /user/userinfo/1
{
"name":"李四",
"age":22,
"city":"深圳",
"description":"李四来自湖北武汉!"
}
新增文档数据 id=4
PUT /user/userinfo/4
{
"name":"张三丰",
"age":66,
"city":"武汉",
"description":"在武汉读书,家在武汉!"
}
新增文档数据 id=5
PUT /user/userinfo/5
{
"name":"赵子龙",
"age":77,
"city":"广州",
"description":"赵子龙来自深圳宝安,但是在广州工作!",
"address":"广东省茂名市"
}
(6)修改数据
**a.替换操作**
更新数据可以使用之前的增加操作,这种操作会将整个数据替换掉
更新数据,id=4
PUT /user/userinfo/4
{
"name":"张三丰",
"description":"在武汉读书,家在武汉!在深圳工作!"
}
**b.更新操作**
使用POST更新某个域的数据
POST /user/userinfo/4/_update
{
"doc":{
"name":"张三丰",
"description":"在武汉读书,家在武汉!在深圳工作!"
}
}
(7)删除Document
删除数据
DELETE user/userinfo/4
数据查询
(1)查询所有数据
GET /user/_search
(2)根据ID查询
GET /user/userinfo/2
(3)Sort排序
GET /user/_search
{
"query":{
"match_all": {}
},
"sort":{
"age":{
"order":"desc"
}
}
}
(4)分页
GET /user/_search
{
"query":{
"match_all": {}
},
"sort":{
"age":{
"order":"desc"
}
},
"from": 0,
"size": 2
}
解释:
from:从下N的记录开始查询
size:每页显示条数
过滤查询
(1)term过滤
term主要用于分词精确匹配,如字符串、数值、日期等
(不适合情况:1.列中除英文字符外有其它值 2.字符串值中有冒号或中文 3.系统自带属性如_version)
GET _search
{
"query":{
"term":{
"city":"武汉"
}
}
}
(2)terms 过滤
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。
如果某个字段指定了多个值,那么文档需要一起去做匹配 。
GET _search
{
"query":{
"terms":{
"city":
[
"武汉",
"广州"
]
}
}
}
(3) range 过滤
range过滤允许我们按照指定范围查找一批数据。例如我们查询年龄范围
GET _search
{
"query":{
"range": {
"age": {
"gte": 30,
"lte": 57
}
}
}
}
解释:
过滤-range 范围过滤
gt表示> gte表示=>
lt表示< lte表示<=
(4)exists过滤
exists 过滤可以用于查找拥有某个域的数据
GET _search
{
"query": {
"exists":{
"field":"address"
}
}
}
(5) bool 过滤
bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含一下操作符:
- must : 多个查询条件的完全匹配,相当于 and。
- must_not : 多个查询条件的相反匹配,相当于 not。
- should : 至少有一个查询条件匹配, 相当于 or。
这些参数可以分别继承一个过滤条件或者一个过滤条件的数组:
GET _search
{
"query": {
"bool": {
"must": [
{
"term": {
"city": {
"value": "深圳"
}
}
},
{
"range":{
"age":{
"gte":20,
"lte":99
}
}
}
]
}
}
}
(6) match_all 查询
可以查询到所有文档,是没有查询条件下的默认语句。
GET _search
{
"query": {
"match_all": {}
}
}
(7) match 查询
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符
GET _search
{
"query": {
"match": {
"description": "武汉"
}
}
}
(8)prefix 查询 (前缀匹配)
以什么字符开头的,可以更简单地用 prefix ,例如查询所有以 张 开始的用户描述
GET _search
{
"query": {
"prefix": {
"name": {
"value": "张"
}
}
}
}
(9)multi_match 查询
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个
多个域匹配搜索
GET _search
{
"query": {
"multi_match": {
"query": "深圳",
"fields": [
"city",
"description"
]
}
}
}
4.数据导入ES
4.1SpringData Elasticsearch介绍
SpringData介绍
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。
Spring Data的官网:http://projects.spring.io/spring-data/
SpringData ES介绍
Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。
官方网站:http://projects.spring.io/spring-data-elasticsearch/
4.2 搜索工程搭建
创建搜索微服务工程,该工程主要提供搜索服务以及索引数据的更新操作。
(1)API工程搭建 (添加pom依赖)
(2)搜索微服务搭建 (application.yml配置)
(3)启动类 (ES扫描,feign调用)
4.3 数据导入
现在需要将数据从数据库中查询出来,然后将数据导入到ES中。
数据导入流程如下:
1.请求search服务,调用数据导入地址
2.根据注册中心中的注册的 xxx 服务的地址,使用Feign方式查询 需要导入的数据
3.使用SpringData Es将查询到的 数据集合 导入到ES中
文档映射Bean创建
搜索数据的时候,会根据属性搜索数据,并且不是所有的属性都需要分词搜索,我们创建JavaBean,将JavaBean数据存入到ES中要以搜索条件和搜索展示结果为依据
网友评论