Day9. ElasticSearch

一、引言

  1. 什么是ElasticSearch?
    Elasticsearch是一个实时的分布式搜索和分析引擎。区别与Solr,它本身就是分布式的。ElasticSearch是一个基于Lucene的搜索服务器。
  2. ElasticSearch特点?
    (1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公
    司;也可以运行在单机上
    (2)将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES;
    (3)开箱即用的,部署简单
    (4)全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理
  3. ElasticSearch体系结构
    Elasticsearch与MySQL数据库逻辑结构概念的对比
Elasticsearch 关系型数据库Mysql
索引(index) 数据库(databases)
类型(type) 表(table)
文档(document) 行(row)

基本单位是文档,多个文档组成类型,多个类型组成索引

二、ElasticSearch部署、启动及使用

  1. 下载并解压 elasticsearch-5.6.8.zip (新版本为6.5.2)
  2. 运行
    无需安装,解压安装包后即可使用
    在命令提示符下,进入ElasticSearch安装目录下的bin目录,执行命令
elasticsearch

图1
即可启动。可以登陆查看: http://127.0.0.1:9200/ 返回的是json形式的数据

  1. Postman调用RestAPI测试

①新建索引 put
图2

②新建文档 post
图3

③查询所有文档 get
图4

④修改文档
图5

注意:如果我们在地址中的_id不存在,则会创建新文档。

⑤按_id查询文档
get方式

http://127.0.0.1:9200/my_elasticsearch/article/AWeawKmKmNamsPnXVYvs

⑥条件查询

http://127.0.0.1:9200/my_elasticsearch/article/_search?q=content: 成功

图6
ps.支持模糊查询,且单个汉字也可以,所以内部不是IK分词器

⑦模糊查询 加 *
如上的条件查询,并不是模糊查询。
因为基本单位不一样,条件查询是根据词条来查询,并不是模糊查询
⑧删除文档
根据_id删除文档,删除_id为1的文档 DELETE方式提交

DELETE   http://127.0.0.1:9200/my_elasticsearch/article/AWeawKmKmNamsPnXVYvs

三、Head插件的安装与使用

我们一般都会使用图形化界面来实现Elasticsearch的日常管理。

  1. 安装
  • 步骤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

# ps.若长时间卡住,不执行,可以先执行下方的,再执行上边的
npm config set registry https://registry.npm.taobao.org
  • 步骤4:
    将grunt安装为全局命令 。Grunt是基于Node.js的项目构建工具。它可以自动运行你所
    设定的任务
npm install -g grunt-cli
  • 步骤5:安装依赖(在elasticsearch-head-master的文件下,cmd执行),下载一堆插件
cnpm install

下载完,在node_modules文件夹下,有一堆东西

  • 步骤6:
    进入head目录启动head,在命令提示符下输入命令
grunt server
  • 步骤7:
    打开浏览器,输入 http://localhost:9100
    图7

  • 步骤8:(解决跨域问题)
    点击连接按钮没有任何相应,按F12发现有如下错误
    No ‘Access-Control-Allow-Origin’ header is present on the requested resource
    这个错误是由于elasticsearch默认不允许跨域调用,而elasticsearch-head是属于前端工
    程,所以报错。
    我们这时需要修改elasticsearch的配置,让其允许跨域访问。
    修改elasticsearch配置文件:elasticsearch.yml,增加以下两句命令:

http.cors.enabled: true
http.cors.allow-origin: "*"

此步为允许elasticsearch跨越访问 点击连接即可看到相关信息

  • 进入后,如下图:
    图8

四、IK分词器

IK分词是一款国人开发的相对简单的中文分词器,在工程应用中IK算是比较流行的一款!

  1. 安装
    下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases 下载5.6.8版本
    (1)先将其解压,将解压后的elasticsearch文件夹重命名文件夹为ik
    (2)将ik文件夹拷贝到elasticsearch/plugins 目录下。
    (3)重新启动,即可加载IK分词器

  2. IK提供了两个分词算法ik_smart 和 ik_max_word
    其中 ik_smart 为最少切分,ik_max_word为最细粒度划分
    (1)最小切分ik_smart 与 最细切分ik_max_word

http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我喜欢周杰伦
http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我喜欢周杰伦

图9

  1. 自定义词库
    步骤:
    (1)进入elasticsearch/plugins/ik/config目录
    (2)新建一个custom.dic文件,编辑内容:(文件保存utf-8格式;如果不好使,尝试加首行加一行空格)
邓肯
帕克
吉诺比利
波波维奇

修改IKAnalyzer.cfg.xml(在ik/config目录下)

<properties>
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 -->
	<entry key="ext_dict">custom.dic</entry>
	 <!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords"></entry>
	<!--用户可以在这里配置远程扩展字典 -->
	<!-- <entry key="remote_ext_dict">words_location</entry> -->
	<!--用户可以在这里配置远程扩展停止词字典-->
	<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

重新启动elasticsearch,通过浏览器测试分词效果

http://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
    }
  ]
}

五、代码编写

  1. 依赖
<dependency>
     <groupId>org.springframework.data</groupId>
     <artifactId>spring-data-elasticsearch</artifactId>
     <version>3.0.6.RELEASE</version>
</dependency>
  1. application.yml、入口类正常开发
server: 
  port: 9007
spring: 
  application:  
    name: my-es #指定服务名
  data:
    elasticsearch:
      cluster-nodes: 127.0.0.1:9300	#java
  1. 使用继承extends ElasticsearchRepository方式开发dao即可,即springdata的一系列操作,此处省略。

六、ElasticSearch与MySQL数据同步(提到ES必提到Logstash)

  1. 什么是Logstash?
    Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集
    起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。
  2. 安装与测试
  • 解压logstash-5.6.8,并进入bin目录
logstash -e 'input { stdin { } } output { stdout {} }'	#-e 后边跟着执行语句	#-f 后边跟着文件
#这句话的意思是,键盘输入,在控制台原样显示

图10
所以正常应该:输入input写mysql,输出output写索引库

命令行参数:
-e 执行
–config 或 -f 配置文件,后跟参数类型可以是一个字符串的配置或全路径文件名或全路径
路径(如:/etc/logstash.d/,logstash会自动读取/etc/logstash.d/目录下所有*.conf 的文
本文件,然后在自己内存里拼接成一个完整的大配置文件再去执行)

  1. Mysql数据导入ElasticSearch
    (1)在logstash-5.6.8安装目录下创建文件夹mysqletc (名称随意)
    (2)文件夹下创建mysql.conf (名称随意) ,内容如下:
input {
  jdbc {
	  # mysql jdbc connection string to our backup databse
	  jdbc_connection_string => ""
	  # the user we wish to excute our statement as
	  jdbc_user => ""
	  jdbc_password => ""
	  # the path to our downloaded jdbc driver  
	  jdbc_driver_library => ""
	  # the name of the driver class for mysql
	  jdbc_driver_class => "com.mysql.jdbc.Driver"
	  jdbc_paging_enabled => ""
	  jdbc_page_size => ""
	  #以下对应着要执行的sql的绝对路径。
	  #statement_filepath => ""
	  statement => ""
	  #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
      schedule => "* * * * *"
  }
}

output {
  elasticsearch {
	  #ESIP地址与端口
	  hosts => "" 
	  #ES索引名称(自己定义的)
	  index => ""
	  #自增ID编号
	  document_id => "%{id}"
	  document_type => ""
  }
  stdout {
      #以JSON格式输出
      codec => json_lines
  }
}

下图为填写示例:(我的端口不小心中文字符了,难受~)
图11
(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的数据显示,看是否也更新了数据。
没什么问题的话,会显示如下结果
图12

猜你喜欢

转载自blog.csdn.net/weixin_42838993/article/details/84964060
今日推荐