同步操作将从 sol/elasticsearch-api 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
The Elastic Stack, 包括 Elasticsearch、Kibana和 Logstash(也称为 ELK Stack)。 能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视 化。Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上 百台服务器,处理 PB(1024TB) 级别的数据。
停顿词:
英文:a、an、the、of等
中文:的、了、着、是 、标点符号等
Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时 候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。 一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。建 立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。 基于以上原因可以分析得出,在一些生产环境中,使用常规的搜索方式,性能是非常差的:
基于以上原因可以分析得出,在一些生产环境中,使用常规的搜索方式,性能是非常差的:
Elasticsearch 的官方地址:https://www.elastic.co/cn/
EKL相关软件中国下载地址:https://elasticsearch.cn/download/
使用版本:Centos7 + Java 8 + Elasticsearch 7.8.0
# 注意【ES不能以root用户身份启动必须创建普通用户】
#1.创建用户组在linux系统中创建新的组
groupadd es
#2.创建新的用户es并将es用户放入es组中
useradd es -g es
#3.修改es用户密码
passwd es
#4.授权es 用户
chown -R es:es /home/elk/
#5.切换 es 用户
# 将 elasticsearch-7.8.0-linux-x86_64.tar.gz 上传 /home/elk
# 在 /home/elk目录下进行解压
tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz
#进入bin目录 执行 ./elasticsearch 进行启动
- bin 可执行的二进制文件的目录
- config 配置文件的目录
- lib 运行时依赖的库
- logs 运行时日志文件
- modules 运行时依赖的模块
- plugins 可以安装官方以及第三方插件
# 执行如下命令测试客户端操作
# 注意:9300 端口为 Elasticsearch 集群间组件的通信端口,9200 端口为浏览器访问的 http
# 协议 RESTful 端口。
- curl http://localhost:9200
#1.本机服务器采用root用户直接关闭防火墙 || 云服务器开启9200,9300安全组端口
- systemctl disable firewalld.service
- systemctl status firewalld.service
2.开启ES远程访问
- vim elasticsearch.yml 将原来network修改为以下配置:
network.host: 0.0.0.0
3.进入bin目录./elasticsearch 进行启动
4.输入 http://服务器ip:9200/ 看到如下结果 安装成功!
解决方案:
# 在最后面追加下面内容
# limits.conf系统资源的使用限制
- vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
#重新登录后检测配置是否生效 执行下面四条命令
- ulimit -Hn
- ulimit -Sn
- ulimit -Hu
- limit -Su
解决方案:
vim /etc/security/limits.d/20-nproc.conf
修改内容:启动用户名 nproc 4096
原文件:
修改后:
解决方案:
#使用root用户修改系统配置 在文件末尾添加
#文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量
- vim /etc/sysctl.conf
vm.max_map_count=655360
# 检测是否配置生效
sysctl -p
解决方案:
vim config/elasticsearch.yml
#添加配置
discovery.seed_hosts: ["127.0.0.1"]
cluster.initial_master_nodes: ["node-1"]
ES 里的 Index 可以看做一个库,而 Types 相当于表,Documents 则相当于表的行。 这里 Types 的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个 type,Elasticsearch 7.X 中, Type 的概念已经被移除了。
Elasticsearch 使用一种称为倒排索引的结构,它适用于快速的全文搜索
相关推荐:https://blog.csdn.net/qq_36551991/article/details/108889571
漫画理解:https://www.cnblogs.com/shwang/p/12074470.html
正排索引
在 ES 中采用的是一种名叫倒排索引的数据结构;在正式讲倒排索引之前先来聊聊和他相反的正排索引。肯定会对应有正向索引。所谓的正向索引,就是搜索引擎会将待搜索的文件都对应一个文件 ID,搜索时将这个 ID 和搜索关键字进行对应。
InnoDB存储引擎就是用B+Tree实现其索引结构
倒排索引
优缺点对比:
- 官网参考地址 https://www.elastic.co/guide/en/elasticsearch/reference/7.x/mapping-types.html
1. 核心数据类型
(1)字符串类型: text, keyword
(2)数字类型:long, integer, short, byte, double, float, half_float, scaled_float
(3)日期:date
(4)日期 纳秒:date_nanos
(5)布尔型:boolean
(6)Binary:binary
(7)Range: integer_range, float_range, long_range, double_range, date_range
2. 复杂数据类型
(1)Object: object(for single JSON objects)
(2)Nested: nested (for arrays of JSON objects)
(1)Geo-point: geo_point (for lat/lon points)
(2)Geo-shape: geo_shape (for complex shapes like polygons)
4. 特殊数据类型
(1)IP: ip (IPv4 和 IPv6 地址)
(2)Completion类型:completion (to provide auto-complete suggestions)
(3)Token count:token_count (to count the number of tokens in a string)
(4)mapper-murmur3:murmur3(to compute hashes of values at index-time and store them in the index)
(5)mapper-annotated-text:annotated-text (to index text containing special markup (typically used for identifying named entities))
(6)Percolator:(Accepts queries from the query-dsl)
(7)Join:(Defines parent/child relation for documents within the same index)
(8)Alias:(Defines an alias to an existing field.)
(9)Rank feature:(Record numeric feature to boost hits at query time.)
(10)Rank features:(Record numeric features to boost hits at query time.)
(11)Dense vector:(Record dense vectors of float values.)
(12)Sparse vector:(Record sparse vectors of float values.)
(13)Search-as-you-type:(A text-like field optimized for queries to implement as-you-type completion)
5.数组类型
在Elasticsearch中,数组不需要一个特定的数据类型,任何字段都默认可以包含一个或多个值,当然,这多个值都必须是字段指定的数据类型。
6.Multi-fields
Multi-fields 通常用来以不同的方式或目的索引同一个字段。比如,一个字符串类型字段可以同时被映射为 text 类型以用于全文检索、 keyword字段用于排序或聚合。又或者,你可以用standard分析器、english分析器和french分析器来索引同一个 text字段。
Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解, 我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比。
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于关系型数据库中Database 的概念。在一个集群中,如果你想,可以定义任意多的索引。
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数 据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可 以为评论数据定义另一个类型。类型类似于关系型数据库中Table的概念。
Mapping是ES中的一个很重要的内容,它类似于传统关系型数据中table的schema,用于定义一个索引(index)中的类型(type)的数据的结构。 在ES中,我们可以手动创建type(相当于table)和mapping(相关与schema),也可以采用默认创建方式。在默认配置下,ES可以根据插入的数据自动地创建type及其mapping。 mapping中主要包括字段名、字段数据类型和字段索引类型
**一个文档是一个可被索引的基础信息单元,类似于表中的一条记录。**比如,你可以拥有某一个员工的文档,也可以拥有某个商品的一个文档。文档以采用了轻量级的数据交换格式JSON(Javascript Object Notation)来表示。
GET /_cat/indices?v
PUT /dangdang/
DELETE /indexName
PUT /test_index
{
"mappings": {
"properties": {
"id":{"type": "long"},
"title": { "type": "text" },
"name": { "type": "text" },
"age": { "type": "integer" },
"createTime": {
"type": "date"
}
}
}
}
PUT /ems/_doc/1 #/索引/类型/id
{
"name":"赵小六",
"age":23,
"bir":"2012-12-12",
"content":"这是一个好一点的员工"
}
DELETE /ems/emp/1
POST /sys_menu/_update/1339550467939639303
{
"doc": { "menu_name": "Jane Doe" }
}
GET /sys_menu/_doc/1339550467939639303
常用为中文分词器(IK Analyzer)与拼音分词器(Pinyin Analyzer)
将下载的分词器压缩包解压后放入elasticsearch\plugins目录下 重启elasticsearch 即可
IK分词器提供了两种mapping类型用来做文档的分词分别是 ik_max_word
和 ik_smart
GET /_analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国"
}
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国"
}
IK支持自定义扩展词典
和停用词典
,所谓**扩展词典
就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。停用词典
**就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典
如何定义扩展词典和停用词典可以修改IK分词器中config
目录中IKAnalyzer.cfg.xml
这个文件。
词典的编码必须为UTF-8,否则无法生效
1. 修改vim IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext_dict.dic;extra_single_word.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopword.dic</entry>
</properties>
2. 在ik分词器目录下config目录中创建ext_dict.dic文件 编码一定要为UTF-8才能生效
vim ext_dict.dic 加入扩展词即可
3. 在ik分词器目录下config目录中创建ext_stopword.dic文件
vim ext_stopword.dic 加入停用词即可
4.重启es生效
<!---------------------------- 优雅的分割线 ----------------------------------------->
5.在实际生产中可以使用远程服务器文件,这种方案可以支持热更新 (更新服务器文件,ik分词词库也会重新加载)
6. 修改vim /myselfFile/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml
这里以ngnix为例,(搭建 nginx 环境过程自行咨询小度):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict"></entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">http://ip:port/ik/ik.txt</entry>
</properties>
7. 创建ik分词词库文件
cd /yourLocalPath/nginx/html
mkdir ik
cd ik
vim ik.txt
GET /_analyze
{
"analyzer": "pinyin",
"text": "刘德华"
}
Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
Kibana 可以使大数据通俗易懂。它很简单,基于浏览器的界面便于您快速创建和分享动态数据仪表板来追踪 Elasticsearch 的实时数据变化。
搭建 Kibana 非常简单。您可以分分钟完成 Kibana 的安装并开始探索 Elasticsearch 的索引数据 — 没有代码、不需要额外的基础设施。
# 1.解压tar包
tar -zxvf kibana-7.8.0-linux-x86_64.tar.gz
# 2.修改kibana 配置文件
vim ./kibana/config/kibana.yml
# 3.修改内容为
- server.host: "192.168.202.200" #ES服务器主机地址
- elasticsearch.hosts: ["http://192.168.202.200:9200"] #ES服务器地址
- i18n.locale: "zh-CN" #修改国际化为中文
#4.启动 kibana 启动后 exit 退出进行后台运行
./kibana &
# 访问 http://ip:5601
Logstash 是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理。
优点:
缺点:
Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。
下载地址:https://artifacts.elastic.co/downloads/logstash/logstash-7.8.0.tar.gz
tar -zxvf logstash-7.8.0.tar.gz
上传Mysql驱动
编写Elasticsearch mappings
{
"template": "api_news_tpl",
"settings": {
"index.refresh_interval": "1s"
},
"index_patterns": [
"api_news"
],
"mappings": {
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "text",
"analyzer": "standard",
"fields": {
"max_word": {
"type": "text",
"analyzer": "ik_max_word"
},
"suggest": {
"type": "completion",
"analyzer": "ik_max_word"
},
"standard": {
"type": "completion",
"analyzer": "standard"
},
"pinyin": {
"type": "completion",
"analyzer": "pinyin"
}
}
},
"category": {
"type": "text",
"analyzer": "standard",
"fields": {
"max_word": {
"type": "text",
"analyzer": "ik_max_word"
},
"suggest": {
"type": "completion",
"analyzer": "ik_max_word"
},
"standard": {
"type": "completion",
"analyzer": "standard"
},
"pinyin": {
"type": "completion",
"analyzer": "pinyin"
}
}
},
"author_name": {
"type": "text",
"analyzer": "standard",
"fields": {
"max_word": {
"type": "text",
"analyzer": "ik_max_word"
},
"suggest": {
"type": "completion",
"analyzer": "ik_max_word"
},
"standard": {
"type": "completion",
"analyzer": "standard"
},
"pinyin": {
"type": "completion",
"analyzer": "pinyin"
}
}
},
"news_url": {
"type": "keyword"
},
"thumbnail_pic": {
"type": "keyword"
},
"is_content": {
"type": "keyword"
},
"date": {
"type": "date"
},
"create_time": {
"type": "date"
},
"update_time": {
"type": "date"
},
"is_delete": {
"type": "integer"
}
}
}
}
3.编写同步配置文件
input {
jdbc {
# mysql相关jdbc配置
jdbc_connection_string => "jdbc:mysql://localhost:3306/elasticsearch-api?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true"
jdbc_user => "root"
jdbc_password => "root"
# jdbc连接mysql驱动的文件目录,可去官网下载:https://dev.mysql.com/downloads/connector/j/
jdbc_driver_library => "D:\DevZip\logstash-7.9.2\config\mysql-connector-java-8.0.21.jar"
# the name of the driver class for mysql
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
#是否启动分页
jdbc_paging_enabled => true
jdbc_page_size => "50000"
jdbc_default_timezone =>"Asia/Shanghai"
# 可以直接写SQL语句在此处,如下:同步边界"sql_last_value"
statement => "SELECT id,title,date,category,author_name,news_url,thumbnail_pic,is_content,create_time, update_time,is_delete FROM api_news where update_time >= :sql_last_value"
# 也可以将SQL定义在文件中,如下:
#statement_filepath => "./config/jdbc.sql"
# 这里类似crontab,可以定制定时操作,比如每分钟执行一次同步(分 时 天 月 年)
schedule => "* * * * *"
# 是否记录上次执行结果, 如果为真,将会把上次执行到的 tracking_column 字段的值记录下来,保存到 last_run_metadata_path 指定的文件中
record_last_run => true
# 是否需要记录某个column 的值,如果record_last_run为真,可以自定义我们需要 track 的 column 名称,此时该参数就要为 true. 否则默认 track 的是 timestamp 的值.
use_column_value => true
# 如果 use_column_value 为真,需配置此参数. track 的数据库 column 名,该 column 必须是递增的. 一般是mysql主键
tracking_column => "update_time"
tracking_column_type => "timestamp"
#默认从 1970 01-01 08:00:00开始
last_run_metadata_path => "./api_news_last_id"
# 是否清除 last_run_metadata_path 的记录,如果为真那么每次都相当于从头开始查询所有的数据库记录
clean_run => false
#是否将 字段(column) 名称转小写
lowercase_column_names => false
plugin_timezone => "local"
}
}
filter {
ruby {
code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}
ruby {
code => "event.set('@timestamp',event.get('timestamp'))"
}
ruby {
code => "event.set('date', event.get('date').time.localtime + 8*60*60)"
}
ruby {
code => "event.set('update_time', event.get('update_time').time.localtime + 8*60*60)"
}
ruby {
code => "event.set('create_time', event.get('create_time').time.localtime + 8*60*60)"
}
mutate {
remove_field => ["timestamp"]
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "api_news"
# 数据库中数据与ES中document数据关联的字段,此处代表数据库中的id字段和ES中的document的id关联。
document_id => "%{id}"
template => "D:\DevZip\logstash-7.9.2\template\api_news_mappings.json"
template_name => "api_news_tpl"
template_overwrite => true
}
# 这里输出调试,正式运行时可以注释掉
stdout {
codec => json_lines
}
}
4.启动:sh logstah -f "config_path"
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。