1、ElasticSearch简介
主要用于全文搜索
Luence是一套信息检索工具的工具包,包含索引结构,读写索引的工具,排序,搜索规则,ElasticSearch是基于Luence做了一些封装和增强。
es是一个开源的高扩展的分布式全文检索和分析引擎,它可以近乎实时的存储、检索数据;扩展性好,可以扩展到上百台服务器,处理PB级别的数据。
ELK技术:ElasticSearch+Logstash+Kibana
大数据:存储+计算
2、ElasticSearch安装
要求:JDK1.8,ElashticSearch客户端,界面工具。
官网:https://www.elastic.co/
目录结构:
bin:启动文件
config:配置文件
log4j2 日志配置文件
jvm.options java虚拟机相关配置
ElasticSearch.yml ElasticSearch相关的配置文件,默认端口9200
lib 相关jar包
plugins 插件
启动:
运行./bin/elasticsearch.bat脚本即可
浏览器中访问 http://localhost:9100/
安装可视化界面es的插件
1.下载地址:https://github.com/mobz/elasticsearch-head
2.启动:npm install
npm run start
3.连接测试存在跨域问题:
在./config/elasticsearch.yml文件中增加
http.cors.enabled: true
http.cors.allow-origin: "*"
可以将es当作一个数据库,(索引【库】,文档【表】)
3、ELK
ELK是ElasticSearch、Logstash、Kibana三大开源框架的首字母大写简称,ElasticSearch是实时搜索平台框架;Logstash是ELK的中央数据流引擎,用于从不同的目标(文件/数据存储/MQ)中收集不同的数据格式,经过过滤后输出到不同的目的地(文件/MQ/redis/kafka/elasticsearch);Kibana可以将elasticsearch的数据通过页面展示出来。
3.1 Kibana
Kibana:是针对ElasticSearch的开源分析及可视化平台,用来搜索、查看交互存储在elasticsearch索引中的数据
官网:https://www.elastic.co/cn/kibana/下载(kibana版本需要和es一致),解压安装,bin目录下执行.bat文件
访问测试
http://localhost:5601/?code=568771
3.2 ES核心概念
es是面向文档的,一切都是json
集群
节点
索引:数据库
类型:表(之后会弃用)
文档:行
fields:列
物理设计:elasticSearch在后台会把每个索引分成多个分片,每个分片可以在集群中的不同服务器之间迁移
逻辑设计:包含key:value,是一个json对象,文档不需要依赖预先定义的模式,关系型数据库中需要提前定义字段才能使用
分片
映射
es集群下可以有多个索引(数据库),每个索引下可以有多个类型(表),每个类型下可以有多个文档(行),每个文档中可以包含多个字段(列)
3.3 Rest风格操作
3.3.1索引的基本操作,索引类似数据库
创建索引并插入一条数据:
PUT /索引名/类型名(之后默认是_doc)/文档id
{请求体}
PUT /testbai/_doc/1
{
"name": "狂神",
"age": 3
}
创建索引并指定对应的字段和类型:
PUT /testbai2
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age":{
"type": "long"
},
"birth":{
"type": "date"
}
}
}
}
获取索引信息:
GET /testbai
修改数据,使用put,会覆盖原有数据,version会加1,状态变为updated:
PUT /索引名/类型名/文档id
{请求体}
POST /索引名/类型名/文档id/_update
{请求体}
删除索引:
delete 索引名称
delete 索引名称/类型名/文档id
3.3.2文档的基本操作
文档类似数据库的行
添加数据,如果重复put同一个id数据会覆盖,version会更新:
PUT /testuser/user/1
{
"name": "李四",
"age": 23,
"desc": "it,技术宅"
}
获取数据:
GET /testuser/user/1
更新数据:
如果重复put同一个id数据会覆盖,version会更新,如果字段少了,数据会置空:
PUT /testuser/user/1
{
"name": "李四",
"age": 23,
"desc": "it,技术宅"
}
POST _update,推荐这种方式,会更新指定的字段,其他的字段保存不变,如果不加_update会更新指定的字段,其他的字段置空
PUT /testuser/user/1/_update
{
"doc":{
"name": "李四"
}
}
条件查询:
GET /testbai/_doc/_search?q=name:xxx
GET /testbai/_search
{
"query": {
"match": {
"name": "李四"
}
}
}
GET /testbai/_search
{
"query": {
"match": {
"name": "李四"
}
},
"_source": [
"name","age"
]
}
_source:只查询name和age字段的结果
排序并分页:
GET /testbai/_doc/_search
{
"query": {
"match": {
"name": "李四"
}
},
"sort": [
{
"age": {"order": "asc"}
}
],
"from": "0",
"size": "1"
}
bool query 查询是把任意多个简单查询组合在一起,每个选项的含义如下:
must:文档必须匹配,该选项下的查询条件,相当于逻辑运算的 AND,且参与文档相关度的评分。
should:文档可以匹配 should 选项下的查询条件也可以不匹配,相当于逻辑运算的 OR,且参与文档相关度的评分。
must_not:与 must 相反,匹配该选项下的查询条件的文档不会被返回;需要注意的是,must_not 语句不会影响评分,它的作用只是将不相关的文档排除。
filter:用于过滤,范围值的查询。
term可精确查询,match会用分词器进行解析
keyword和text类型:
keyword不会被分词器分析,作为一个整体
text会被分词器拆分
高亮显示:
GET testbai/_search
{
"query":
{
"match":
{
"name": "狂神"
}
},
"highlight": {
"fields": {"name": {}}
}
}
4、倒排索引
关键词到文档id的映射
对文档进行分词,形成词项字典和倒排表的对应关系