ElasticSearch
- 基于lucene的搜索服务器(搜索引擎)
- 分布式多用户
- 基于Restful
- java开发
- ELK日志分析系统
- 是一个nosql
-
关系数据搜索缺点
- 无法打分
- 无法分布式
- 无法解析搜索请求
- 效率低
- 分词
安装
-
-
config/elasticsearch.yml文件配置,解决跨域问题
- http.cors.enabled: true
- http.cors.allow-origin: "*"
-
- elasticsearch-head:可视化插件
- kibana:可以官网下载
启动
-
elasticsearch
- ./bin/elasticsearch -d #后端启动
-
elasticsearch-head
- npm install
- npm run start
搭建集群
-
配置master
cluster.name: jim node.name: master node.master: true network.host: 127.0.0.1 # 端口保持默认
-
配置slave
cluster.name: jim-slave node.name: slave1 network.host: 127.0.0.1 http.port: 8200 # 避免和master端口冲突 discovery.zen.ping.unicast.hosts: ["127.0.0.1"] # 查找master
概念
- 集群:多个节点的集合
- 节点:集群中的每一个es应用
-
索引:含有相同属性的文档集合【sql中数据库】
- 分片:一份数据分几份,默认5,只能在创建的时候指定,不可以后期修改
- 副本:创建几份数据,默认1
-
类型:索引可以定义一个或多个类型,文档必须属于一个类型【sql中表】
- text
- keyword
- integer
- date
- 文档:可以被索引的基本数据单位【sql中数据】
- 倒排索引(inverted index)
- TF-IDF
索引的CRUD操作
- 创建
PUT lagou
{
"setting":{
"index":{
"number_of_shards":5, # 切片数
"number_of_replicas":1 # 副本数,可修改
}
}
}
# 获取设置
GET lagou/_settings
GET _all/_settings
GET _settings
GET lagou1,lagou2/_settings
#更新配置
PUT lagou/_settings
{
"number_of_replicas":2
}
#获取索引
GET lagou
GET _all
#添加数据
POST lagou/job/1
{
"key":"value",
...
}
#获取数据
GET lagou/job/1 #指定id存储
GET lagou/job/ #自动生成一个uuid当作id
GET lagou/job/1?_source=key1,key2
#修改数据
PUT lagou/job/1
{
"key":"value",
...
}
POST lagou/job/1/_update
{
"doc":{
"key":"value",
...
}
}
# 脚本形式修改数据
POST lagou/job/1/_update
{
"script":{
"lang":"painless",
"inline":"ctx._source.key = value", # 这里的value就可以使用params.key
"params":{
"key":value
}
}
}
#删除数据
DELETE lagou/job/1
DELETE lagou
批量操作
- 批量获取
GET lagou/job/_mget
{
"docs":{
条件
}
}
GET lagou/job/1/_mget
{
"ids":[id1,id2...]
}
- bulk批量操作
POST _bulk
{"index":{"_index":"lagou","_type":"job","_id":"1"}}
{"title":"批量操作喽","city":"北京"}
{"delete":{"_index":"lagou","_type":"job","_id":"1"}}
{"create":{"_index":"lagou","_type":"job","_id":"1"}}
{"update":{"_index":"lagou","_type":"job","_id":"1"}}
映射(即:创建表字段)
PUT lagou
{
"mappings":{
"type_name":{
"dynamic":false, # 索引固定
"properties":{
"name":{
"store":true,(是否保存)
"type":属性,(即字段类型)
"index":"analyzer" #使用分词
"analyzer":"ik_max_word"(分析器,即分词类型)
},
"age":{
"store":true,
"type":属性(如果是keywork则不会被分词)
},
"date":{
"store":true,
"type":date,
"format":"yy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
...
}
}
}
}
查询
基本查询
- match查询
# 通过id查询
GET lagou/job/id
# 条件查询
GET lagou/job/_search # 可以使用post和get两种方式,建议使用post
{
"stored_fields":[字段1,字段2...], # 指定返回的字段
"query":{
"match":{ # "match_all":{}全部查询 match_phrase:{}完全匹配查询
"字段":内容
...
}
},
"from":1
"size":1
"sort":[
{"字段":{
"order":"desc"
}
}
]
}
- 聚合查询
GET lagou/_search
{
"类型":{
"分组名":{
"term":{ # stat min都可以使用
"字段":内容
...
}
}
}
}
- term查询(全量查询,必须完全匹配)
GET lagou/job/_search
{
"query":{
"term":{
"字段":内容
...
}
}
}
- terms查询(有一个匹配就返回,并且不是全量查询)
GET lagou/job/_search
{
"query":{
"terms":{
"字段":[内容1,...]
...
}
}
}
- 多字段查询
GET lagou/job/_search
{
"query":{
"multi_match":{
"query":内容,
"fields":[字段1^3,字段2...] # ^3表示权重
}
}
}
- 语法查询
GET lagou/job/_search
{
"query":{
"query_string":{
"query":"condition AND|OR condition",
"fields":[字段1^3,字段2...] # ^3表示权重
}
}
}
- 范围查询(时间字段可以使用now关键字)
GET lagou/job/_search
{
"query":{
"range":{
"字段":{
"gte":10,
"lte":20,
"boost":2.0 # 权重
}
}
}
}
组合查询
- bool查询
GET lagou/job/_search
{
"query":{
"bool":{
"filter":{ # 过滤字段
"查询方式":{ # "term"|"match"等
"字段":内容
}
},
"must":[], # 条件必须全部满足
"should":[], # 条件满足其一
"must_not":[] # 必须一个不满足
}
}
}
- 查看分析器结果
GET _analyze
{
"analyzer":"ik_max_word", # 与ik_smart区别:ik_smart以最小词量分词,如工程师就不会再进行工程/师分词
"text":"内容"
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。