1、基本概念
1、Index(索引)
动词,相当于MySQL中的inserts
名词,相当于MysQL中的 Database
2、Type(类型,es6之后移除了)
在Index(索引)中,可以定义一个或多个类型。
类似于MySQL中的 Table;每一种类型的数据放在一起;
3、Document(文档)
保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是JSON格式的,Document就像是MySQL中的某个Table里面的内容;
4、倒排索引机制
分词:将整句分拆为单词。
2、初步检索
1、_cat
GET/_cat/nodes:查看所有节点
GET/_cat/health:查看es健康状况
GET/_cat/master:查看主节点
GET/_cat/indices:查看所有索引
2、索引一个文档(保存)
保存一个数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识PUT customer/external/1,在customer索引下的external类型下保存1号数据为
PUT customer/external/1
{
"name":"John Doe"
}
PUT和POST都可以,
POST新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号
PUT可以新增可以修改。PUT必须指定id,由于PUT需要指定id,我们一般都用来做修改操作,不指定id会报错。
3、查询文档
GET customer/external/1
结果:
{
"_index": "customer", //在哪个索引
"_type": "external", //在哪个类型
"_id":"1", //记录id
"_version":2, //版本号
"_seq_no": 1, //并发控制字段,每次更新就会+1,用来做乐观锁
"_primary_term": 1, //同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": {
"name": "lohn Doe"
}
}
更新携带 ?if_seq_no=0&if_primary_term=1
4、更新文档
POST customer/external/1/_update
{
"doc":{
"name":"John Doew"
}
}
或者
POST customer/external/1
{
"name" : "Iohn Doe2"
}
或者
PUT customer/external/1
{
"name" : "Iohn Doe2"
}
更新同时增加属性
POST customerfexternal/1/_update
{
"doc": { "name" : "Jane Doe", "age":20}
}
5、删除文档&索引
DELETE customer/external/1
DELETE customer
6、bulk批量API
POST customer/external/_bulk
{"index":{"_id":"1"}}
{"name" : "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe"}
语法格式:
{action: {metadata }}\n
{request body }\n
{action: {metadata }}\n
{request body }\n
3、进阶检索
1、检索信息
ES支持两种基本方式检索:
一个 是通过使用REST request URI 发送搜索参数(uri+检索参数)
另一个是通过使用REST request body来发送它们(uri+ 请求体)
GET bank/_search //检索bank下所有信息,包括type和docs
GET bank/_search?g=*&sort=account_number:asc //请求参数方式检索
GET bank/_search //uri+请求体进行检索
{
"query":{
"match_all":{}
},
"sort":[
{
"account_number":{
"order": "desc"
}
}
]
}
2、QueryDSL
基本语法格式:
{
QUERY_NAME:{
ARGUMENT: VALUE,
ARGUMENT: VALUE...
}
}
针对某个字段:
{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
返回部分字段:
"_source":["field","field"]
match[匹配查询]
基本类型 (非字符串),精确匹配,按照评分进行排序
GET bank/_search
{
"query":{
"match":{
"account_number": "20"
}
}
}
字符串,全文检索,按照评分进行排序
{
"query":{
"match":{
"address": "mill"
}
}
}
match_phrase [短语匹配]
将需要匹配的值当成一个整体单词(不分词)进行检索
GET bank/_search
{
"query":{
"match_ phrase":{
"address": "mill road"
}
}
multi_match [多字段匹配]
GET bank/_search
{
"query":{
"multi_match":{
"query": "mill",
"fields": ["state","address"]
}
}
}
bool[复合查询]
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
],
"should":[
{"match":{"lastname": "wallace"}}
]
}
}
}
filter[结果过滤]
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
term
和match一样。匹配某个属性的值。全文检索字段用match,其他非text字段匹配用term。
GET /_search
{
"query": {
"term": {
"user": {
"value": "Kimchy",
"boost": 1.0
}
}
}
}
精确匹配keyword
GET bank/_search
{
"query":{
"match":{
"address.keyword": "mill road"
}
}
3、aggregations聚合分析
#查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
GET bank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"genderAgg": {
"terms": {
"field": "gender . keyword",
"size": 10
}
}
}
}
}
4、映射
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
}
}
}
修改索引和数据迁移(type针对于有类型的索引)
POST_reindex [固定写法]
{
"source":{
"index": "twitter",
"type": "twitter"
},
"dest":{
"index": "new_ _twitter"
}
}
5、分词
1)、安装ik分词器
注意:不能用默认elasticsearch-plugin install.xxx.zip进行自动安装
https://github.com/medcl/elasticsearch-analysis-ik/releases对应es版本安装
docker exec -it 容器id /bin/bash
进入es容器内部plugins目录
wget https://github.com/medc/elasticsearch-analysis- ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
unzip 下载的文件
cd ./bin
elasticsearch plugin list:即可列出系统的分词器
4、springboot整合high-level-client
1、导入依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.1</version>
</dependency>
2、编写配置类,给容器中注入一个RestHighLevelClient
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));