ElasticSearch简单入门

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")));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条代码鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值