ElasticSearch搜索引擎✧完结
Posted 每日小新
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch搜索引擎✧完结相关的知识,希望对你有一定的参考价值。
ES搜索引擎
☣ ☣
一、Kibana
一款开源的数据分析和可视化平台,此处不做主要介绍
二、IK Analysis 中文分词器
- Es的常用插件之一
- IK Analysis插件将Lucene IK分析器集成到elasticsearch中,支持自定义词典。
1、单机配置
官网下载地址
① 安装配置
直接上传资源到linux,解压指定位置,并进行授权
# 创建ik目录
mkdir -p /usr/local/elasticsearch/es1/elasticsearch-7.4.2/plugins/ik
# 解压至ik目录
unzip elasticsearch-analysis-ik-7.4.2.zip -d /usr/local/elasticsearch/es1/elasticsearch-7.4.2/plugins/ik/
#授权个es账户
chown -Rf es:es /usr/local/elasticsearch/
重启ES,测试
② 测试
直接创建索引库和设置mapping
# 创建索引库
curl -X PUT http://localhost:9200/ik -H 'Content-Type:application/json' - d'
"settings":
"number_of_shards": 5,
"number_of_replicas": 1
'
# 设置mapping
# Analyzer分词配置解释:
#ik_smart:粗粒度分词,比如中华人民共和国国歌,会拆分为中华人民共和国,国歌;
#ik_max_word:细粒度分词,比如中华人民共和国国歌,会拆分为中华人民共和国,中华
#人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌,会穷
#尽各种可能的组合。
插入数据
curl -XPOST http://localhost:9200/ik/_create/1 -H 'Content- Type:application/json' -d' "content":"美国留给伊拉克的是个烂摊子吗" '
curl -XPOST http://localhost:9200/ik/_create/2 -H 'Content- Type:application/json' -d' "content":"公安部:各地校车将享最高路权" '
curl -XPOST http://localhost:9200/ik/_create/3 -H 'Content- Type:application/json' -d' "content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船" '
curl -XPOST http://localhost:9200/ik/_create/4 -H 'Content- Type:application/json' -d' "content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首" '
启动Es(启动es要切换到es用户下)和head客户端查看结果:
这里看出,es自动加载了插件ik
进行数据索引查询
三、Elasticsearch导入mysql数据
1、安装Mysql⭐
本文使用5.7.2X版本,如果找不到对应的版本信息,可以通过该地址获取: 下载(es可以说是一个非关系型数据库)
安装
yum -y install mysql57-community-release-el7.rpm
yum -y install mysql-community-server
#如果报错则更新wget
yum -y install wget
#启动查看服务器状态
systemctl start mysqld
systemctl status mysqld
这种安装方式会将MySQL添加至环境变量和启动服务
如果安装后启动失败:
#查看是否安装过数据库
rpm -qa|grep mysql
#删除以前安装的数据库
rpm -e 数据库文件名
#查看数据库安装后的目录
find / -name mysql
find / -name mysqld
#在重新安装
2、修改密码和配置
修改密码并授权
#获取安装后提供的密码
grep "password" /var/log/mysqld.log
#登录数据库
mysql -u root –p
#修改密码规则
set global validate_password_policy=0;
set global validate_password_length=4;
#修改密码
set password = password('root');
#退出重新进入
授权
# 改表法
# 选择数据库
use mysql;
# 最后授权MySQL,允许远程用户登录访问
MySQL update user set host = '%' where user = 'root';
# 刷新权限
flush privileges;
# 授权法
# 允许192.168.10.105(linuxIP地址)连接访问所有库的所有表(*.*),连接密码为1234
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.10.105' IDENTIFIED BY '1234' WITH GRANT OPTION;
# 允许所有连接访问所有库的所有表(*.*),连接密码为1234
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '1234' WITH GRANT OPTION;
# 刷新权限
FLUSH PRIVILEGES;
#关闭防火墙
systemctl stop firewalld
#查看防火墙状态
systemctl status firewalld
一定要设置防火墙,否则windons客户端无法访问
3、数据库忘记密码
忘记密码的修改方法
# 展示所有数据库
show databases;
# 选择数据库
use mysql;
# 展示所有表
show tables;
# 忘记密码后修改密码
# 第一步的作用是启动时跳过验证
1. vi /etc/my.cnf在[mysqld]里加入skip-grant-tables
2. 重启mysql服务,连接mysql无密码登入use mysql;选择数据库
3. 敲下面这行代码修改密码 update mysql.user set authentication_string=password('root') where user='root';
4. vi /etc/my.cnf在[mysqld]里删除skip-grant-tables 重启mysql服务,新密码登录即可
4、安装Logstash
Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的 “存储库” 中,Logstash技术,导入数据,实现数据录入,数据处理管道。下载地址
① 安装与测试
直接安装
#创建安装目录
mkdir -p /usr/local/logstash
#解压
tar -zxvf logstash-7.4.2.tar.gz -C /usr/local/logstash/
安装
cd /usr/local/logstash/logstash-7.4.2
bin/logstash -e 'input stdin output stdout '
成功运行输入helloworld返回一个helloworld就成功了
② 同步mysql数据
上传一个驱动jar,和两个配置文件jdbc.conf,jdbc.sql
#注意:请将mysql的驱动包上传至 logstash-7.4.2/logstash-core/lib/jars/ 目录下
/usr/local/logstash/logstash-7.4.2/logstash-core/lib/jars/
# jdbc.conf
# cd /usr/local/logstash/logstash-7.4.2
# vim jdbc.conf
jdbc
# 配置数据库信息
jdbc_connection_string => "jdbc:mysql://192.168.168.129:3306/shop?useUnicode=true&cha
racterEncoding=UTF-8&useSSL=false" jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_user => "root"
jdbc_password => "1234"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 执行 sql 语句文件
statement_filepath => "/usr/local/logstash/logstash-7.4.2/jdbc.sql"
# 定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 是否将 sql 中 column 名称转小写
lowercase_column_names => false
output
elasticsearch
hosts => ["192.168.168.129:9200"]
index => "shop"
# 文档_id,%goods_id意思是取查询出来的goods_id的值,并将其映射到es的_id字段中
# 文档_id,%goodsId如果是别名,意思是取查询出来的goodsId的值,并将其映射到es的_id
字段中 document_id => "%goodsId"
stdout
codec => json_lines
--------------------------------------------------------------
# jdbc.sql
SELECT
goods_id goodsId,
goods_name goodsName,
market_price marketPrice,
original_img originalImg
FROM
t_goods
# 检测配置文件是否编写正确
bin/logstash -f /usr/local/logstash/logstash-7.4.2/jdbc.conf -t
③ 创建索引库shop与mapping
索引库
mapping:
# 执行数据导入(前提是数据库中shop数据库有数据)
cd /usr/local/logstash/logstash-7.4.2/
#配置文件回去直接调用jdbc.sql语句将查出来的数据导入到es中
bin/logstash -f /usr/local/logstash/logstash-7.4.2/jdbc.conf
#导入较慢
最终结果
查询测试:
四、Elasticsearch的JavaAPI
整合IDEA
1、创建项目并配置、测试
Elasticsearch有两种连接方式: transport 、 rest,ES官方建议使用 rest 方式,
- 直接创建一个maven,java项目引入依赖
<dependencies>
<!-- junit 单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- elasticsearch 服务依赖 -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.4.2</version>
</dependency>
<!-- rest-client 客户端依赖 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.2</version>
</dependency>
<!-- rest-high-level-client 客户端依赖 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
</dependencies>
创建测试类测试:
//连接服务器
public class EsTest
// ES服务器IP
private final static String HOST = "192.168.168.129";
// ES服务器连接方式
private final static String SCHEME = "http";
// 初始化 ES 服务器集群
// 参数分别为:IP,端口,连接方式(默认为http)
private final static HttpHost[] httpHosts =
new HttpHost(HOST, 9200, SCHEME)
;
//客户端
private RestHighLevelClient client=null;
/*** 获取客户端 */
@Before
public void getConnect()
client = new RestHighLevelClient(RestClient.builder(httpHosts));
/*** 关闭连接 */
@After
public void closeConnect()
try
if (null != client)
client.close();
catch (IOException e)
e.printStackTrace();
/*** 查询数据 */
@Test
public void testRetrieve() throws IOException
// 指定索引库和id
GetRequest getRequest = new GetRequest("ik", "4");
// 执行请求
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.getSource());
/*** 添加数据 */
@Test
public void testCreate() throws IOException
// 准备数据
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("username", "zhangsan");
jsonMap.put("age", 18);
jsonMap.put("address", "sh");
// 指定索引库和id及数据
IndexRequest indexRequest = new IndexRequest("ik").id("5").source(jsonMap);
//执行请求
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
/*** 修改数据 */
@Test
public void testUpdate() throws IOException
// 准备数据
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("username", "lisi"); jsonMap.put("age", 20);
jsonMap.put("address", "bj");
// 指定索引库和id及数据
UpdateRequest updateRequest = new UpdateRequest("ik", "5").doc(jsonMap);
// 执行请求
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.toString());
/*** 批量查询-分页查询-高亮查询 */
@Test
public void testHighlight() throws IOException
// 指定索引库
SearchRequest searchRequest = new SearchRequest("shop");
// 构建查询对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 添加分页条件,从第 0 个开始,返回 5 个
searchSourceBuilder.from((5-1)).size(5);
// 构建高亮对象
HighlightBuilder highlightBuilder = new HighlightBuilder();
// 指定高亮字段和高亮样式
highlightBuilder
.field("goodsName")
.preTags("<span style='color:red;'>")
.postTags("</span>");
searchSourceBuilder.highlighter(highlightBuilder);
// 添加查询条件
// 指定从 goodsName 字段中查询
String key = "中国移动联通电信";
searchSourceBuilder.query(QueryBuilders.multiMatchQuery(key, "goodsName"));
// 执行请求
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 总条数
System.out.println(searchResponse.getHits().getTotalHits().value);
// 结果数据(如果不设置返回条数,大于十条默认只返回十条)
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits)
// 构建项目中所需的数据结果集
String highlightMessage = String
.valueOf(hit.getHighlightFields()
.get("goodsName")
.fragments()[0]);
Integer goodsId = Integer.valueOf((Integer) hit.getSourceAsMap().get("goodsId"));
String goodsName = String.valueOf(hit.getSourceAsMap().get("goodsName"));
BigDecimal marketPrice = new BigDecimal(String.valueOf(hit.getSourceAsMap().get("marketPrice")));
String originalImg = String.valueOf(hit.getSourceAsMap().get("originalImg"));
System.out.println("goodsId -> " + goodsId);
System.out.println("goodsName -> " + goodsName);
System.out.println("highlightMessage -> " + highlightMessage);
System.out.println("marketPrice -> " + marketPrice);
System.out.println("originalImg -> " + originalImg);
System.out.println("----------------------------");
<
以上是关于ElasticSearch搜索引擎✧完结的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:如何在 Elasticsearch 中正确使用同义词功能
Elasticsearch:如何在 Elasticsearch 中正确使用同义词功能