1. Windows下载安装elasticsearch
① 下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-4-2
② 修改elasticsearch.yml文件:
cluster.name: my-application
path.data: D:/install/elasticsearch-7.4.2-windows-x86_64/elasticsearch-7.4.2/data
path.logs: D:/install/elasticsearch-7.4.2-windows-x86_64/elasticsearch-7.4.2/logs
③ 配置环境变量:D:\install\elasticsearch-7.4.2-windows-x86_64\elasticsearch-7.4.2\bin
④ 下载ik分词器:https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v7.4.2
⑤ 解压ik分词器,必须解压到D:\install\elasticsearch-7.4.2-windows-x86_64\elasticsearch-7.4.2\plugins\ik目录下
⑥ 点击elasticsearch.bat启动elasticsearch服务,并访问:localhsot:9200
⑦ kibana下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-7-4-2
⑧ 修改kibana.yml文件(不必须):
server.port: 5601
server.host: "localhost"
elasticsearch.hosts: ["http://localhost:9200"]
i18n.locale: "zh-CN"
⑨ 点击kibana.bat启动kibana服务(一定要先启动es):
⑦ kibana下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-7-4-2
⑧ 修改kibana.yml文件(不必须):
server.port: 5601
server.host: "localhost"
elasticsearch.hosts: ["http://localhost:9200"]
i18n.locale: "zh-CN"
⑨ 点击kibana.bat启动kibana服务(一定要先启动es)
⑩ 访问localhost:5601
2. elasticsearc查询命令
索引—数据库、类型—表、文档—一条数据
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-search.html
2.1 _cat命令
GET /_cat/nodes: 查看所有节点
GET /_cat/health: 查看 es 健康状况
GET /_cat/master: 查看主节点
GET /_cat/indices: 查看所有索引 show databases;
2.2 文档操作
① 添加文档
保存一个数据, 保存在哪个索引(数据库)的哪个类型(表)下, 指定用哪个唯一标识,POST可以新增可以修改。 如果不指定 id, 会自动生成 id。 指定 id 就会修改这个数据, 并新增版本号;PUT 可以新增可以修改。 PUT 必须指定 id; 由于 PUT 需要指定 id, 我们一般都用来做修改 操作 。
# 添加文档
# 在数据库book下的novel表中添加一条id=1的数据
# 在索引book下的novel类型中添加一条id=1的文档
PUT customer/external/1
{
"name":"johe"
}
② 查询文档
# 查询文档
GET /book/novel/1
③ 修改文档
带有_update 和不带有_update 的语法区别:
# 修改文档
# 请求体需要加上doc
POST customer/external/1/_update
{"doc":{"name": "John Doew"}}
# 请求体带不带doc都可以
POST customer/external/1
{"name": "John Doe2"}
PUT customer/external/1
{"name": "John Doe"}
Post请求方式可以带有_update,而Put请求不可以
Post请求带有_update时,会对比源文档数据, 如果相同不会有什么操作, 文档 version 不增加 ;
PUT 操作总会将数据重新保存并增加 version 版本;
Put和Post都可以在更新时增加属性;
④ 删除文档
# 删除文档
DELETE customer/external/1
# 删除索引
ELETE customer
⑤ 批量处理文档
POST customer/external/_bulk
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
语法格式:
{ action: { metadata }}
{ request body }
{ action: { metadata }}
{ request body }
复杂实例:
POST /_bulk
{"create": { "_index": "website", "_type": "blog", "_id": "123"}}
{"title": "My first blog post" }
{"index": { "_index": "website", "_type": "blog" }}
{"title": "My second blog post" }
{"update": { "_index": "website", "_type": "blog", "_id": "123"}}
{"doc" : {"title" : "My updated blog post"} }
{"delete": { "_index": "website", "_type": "blog", "_id": "123"}}
导入测试数据:https://github.com/elastic/elasticsearch/blob/6d42e197b82aa1c98a1796d547e373f7029ee27a/docs/src/test/resources/accounts.json
2.3 es检索方式
ES 支持两种基本方式检索 : 一个是通过使用 REST request URI 发送搜索参数(uri+检索参数) 另一个是通过使用 REST request body 来发送它们(uri+请求体)
① uri+检索参数:
GET bank/_search 检索 bank 下所有信息, 包括 type 和 docs
GET bank/_search?q=*&sort=logon_id:asc 请求参数方式检索
GET bank/_search 响应结果解释:
took - Elasticsearch 执行搜索的时间( 毫秒)
time_out - 告诉我们搜索是否超时
_ shards - 告诉我们多少个分片被搜索了, 以及统计了成功/失败的搜索分片
hits - 搜索结果
hits.total - 搜索结果
hits.hits - 实际的搜索结果数组( 默认为前 10 的文档)
sort - 结果的排序 key( 键) ( 没有则按 score 排序)
score 和 max_score –相关性得分和最高得分( 全文检索用)
② uri+请求体:
GET bank/_search
{
# 查询条件
"query": {
"match_all": {}
},
# 排序条件
"sort": [
{
"account_number": {
"order": "desc"
}
}
]
}
2.4 match_all 查询所有
# query 定义如何查询,
# match_all 查询类型【代表查询所有的所有】 , es 中可以在 query 中组合非常多的查询类型完成复杂查询
# 除了query参数之外, 我们也可以传递其它的参数以改变查询结果。 如 sort,size
# from+size 限定, 完成分页功能
# sort 排序, 多字段排序, 会在前序字段相等时后续字段内部排序, 否则以前序为准
GET bank/_search
{
# 查询条件
"query": {
"match_all": {}
},
# 分页条件
"from": 0,
"size": 5,
# 排序条件
"sort": [
{
"account_number": {
"order": "desc"
}
}
]
}
返回部分检索字段:
GET bank/_search
{
"query": {"match_all": {}
},
"from": 0,
"size": 5,
"_source": ["age","balance"]
}
2.5 match 精确查询/模糊查询
① 基本类型( 非字符串) , 精确匹配 :
# match 返回 account_number=20 的
GET bank/_search
{
"query": {
"match": {
"account_number": "20"
}
}
}
② 字符串, 全文检索 :
# 最终查询出 address 中包含 mill 单词的所有记录
# match 当搜索字符串类型的时候, 会进行全文检索, 并且每条记录有相关性得分。
GET bank/_search
{
"query": {
"match": {
"address": "mill"
}
}
}
③ 字符串, 多个单词( 分词+全文检索) :
#最终查询出 address 中包含 mill 或者 lane 或者 mill lane 的所有记录, 并给出相关性得分
GET bank/_search
{
"query": {
"match": {
"address": "mill lane"
}
}
}
2.6 match_phrase 短语匹配,不分词
# 查询出完整包含 mill lane的记录
GET bank/_search
{
"query": {
"match_phrase": {
"address": "mill lane"
}
}
}
2.7 mlti_match多字段匹配
# state 或者 address 包含 mill
GET bank/_search
{
"query": {
"multi_match": {
"query": "mill",
"fields": ["state","address"]
}
}
}
2.8 bool复合查询
bool 用来做复合查询:复合语句可以合并 任何 其它查询语句, 包括复合语句
must: 必须达到 must 列举的所有条件
GET bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "gender": "M" } }
]
}
}
}
must_not: 必须不是指定的情况
should: 应该达到 should 列举的条件, 如果达到会增加相关文档的评分, 并不会改变查询的结果。 如果 query 中只有 should 且只有一种匹配规则, 那么 should 的条件就会被作为默认匹配条件而去改变查询结果
# address 包含 mill, 并且 gender 是 M, 如果 address 里面有 lane 最好不过, 但是 email 必须不包含 baluba.com
GET bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "gender": "M" } }
],
"should": [
{"match": { "address": "lane" }}
],
"must_not": [
{"match": { "email": "baluba.com" }}
]
}
}
}
2.9 filter过滤
must,should,must_not都会计算相关性得分 ,分数越高,文档就越符合您的搜索条件。默认情况下,Elasticsearch返回按这些相关性分数排名的文档。但并不是所有的查询都需要产生分数, 特别是那些仅用于 “filtering”(过滤) 的文档。 为了不计算分数 Elasticsearch 会自动检查场景并且优化查询的执行 。
# 会计算分数
GET bank/_search
{
"query": {
"bool": {
"must": {
"range": {
"balance": {
"gte": 10000,
"lte": 20000
}
}
}
}
}
}
# 不会计算分数
GET bank/_search
{
"query": {
"bool": {
"filter": {
"range": {
"balance": {
"gte": 10000,
"lte": 20000
}
}
}
}
}
}
2.10 term查询
term的查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,对你的关键字去文档分词库中去匹配内容。和 match 一样。 匹配某个属性的值。 全文检索字段用 match, 其他非 text 字段匹配用 term。
# 如果是精确值(age,balance等数字)字段,建议使用term,如果是全文检索字段,建议使用match
GET bank/_search
{
"query": {
"bool": {
"must": [
{"term": {
"age": {
"value": "28"
}
}},
{"match": {
"address": "990 Mill Road"
}}
]
}
}
}
terms和term的查询机制是一样,都不会将指定的查询关键字进行分词,直接去分词库中匹配,找到相应文档内容。
terms是在针对一个字段包含多个值的时候使用。
2.11 aggregations( 执行聚合)
聚合提供了从数据中分组和提取数据的能力。 最简单的聚合方法大致等于 SQL GROUP BY 和 SQL 聚合函数。 在 Elasticsearch 中, 您有执行搜索返回 hits( 命中结果) , 并且同时返回聚合结果, 把一个响应中的所有 hits( 命中结果) 分隔开的能力。 这是非常强大且有效的,您可以执行查询和多个聚合, 并且在一次使用中得到各自的( 任何一个的) 返回结果, 使用一次简洁和简化的 API 来避免网络往返。
① 搜索 address 中包含 mill 的所有人的年龄分布以及平均年龄, 但不显示这些人的详情 :
# size: 0 不显示搜索数据
# aggs: 执行聚合。 聚合语法如下:
# "aggs": {
# "aggs_name 这次聚合的名字(随便起名), 方便展示在结果集中": {
# "AGG_TYPE 聚合的类型( avg,term,terms) ": {}
# }
# }
GET bank/_search
{
"query": {
"match": {
"address": "mill"
}
},
"aggs": {
"age_agg": {
"terms": {
"field": "age"
}
},
"avg_age": {
"avg": {
"field": "age"
}
}
},"size": 0
}
② 按照年龄聚合, 并且请求这些年龄段的这些人的平均薪资 :
GET bank/account/_search
{
"query": {
"match_all": {}
},
"aggs": {
"age_agg": {
"terms": {
"field": "age",
"size": 1000
},
"aggs": {
"banlances_avg": {
"avg": {
"field": "balance"
}
}
}
}
} ,
"size": 1000
}
③ 查出所有年龄分布, 并且这些年龄段中 M 的平均薪资和 F 的平均薪资以及这个年龄段的总体平均薪资 :
GET bank/account/_search
{
"query": {
"match_all": {}
},
"aggs": {
"age_agg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"gender_agg": {
"terms": {
"field": "gender.keyword",
"size": 100
},
"aggs": {
"balance_avg": {
"avg": {
"field": "balance"
}
}
}
},
"balance_avg":{
"avg": {
"field": "balance"
}
}
}
}
} , "size": 1000
}
3. Mapping映射
① 创建索引并指定映射:
PUT /my-index
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" },
"name": { "type": "text" }
}
}
}
② 添加新的字段映射:
PUT /my-index/_mapping
{
"properties": {
"employee-id": {
"type": "keyword",
"index": false
}
}
}
③ 更新映射:
对于已经存在的映射字段, 我们不能更新。 更新必须创建新的索引进行数据迁移 ,先创建出 new_twitter 的正确映射。 然后使用如下方式进行数据迁移 :
PUT /newbank1
{
"mappings" : {
"properties" : {
"account_number" : { "type" : "long"},
"address" : {"type" : "text"},
"age" : {"type" : "integer"},
"balance" : { "type" : "integer"},
"city" : {"type" : "keyword"},
"email" : {"type" : "keyword"},
"employer" : {"type" : "keyword"},
"firstname" : {"type" : "keyword"},
"gender" : {"type" : "keyword"},
"lastname" : { "type" : "keyword"},
"state" : {"type" : "keyword"}
}
}
}
POST _reindex
{
"source": {
"index": "bank",
"type": "account"
},
"dest": {
"index": "newbank1"
}
}
|