壹:入门
一、新增数据
/coustomer/external/1 在coustomer索引下external类型中保留1号数据
1.POST:如果不指定id,会自动生成id,指定id就会修改没有就新增
2.PUT:必须指定id 不指定会报错,指定一般用于修改操作
二、查询数据
1.GET:/coustomer/external/1 查询id为1的数据
三、修改数据
1.PUT乐观锁做并发修改:每次修改_seq_no都会发生改变
2.PUT POST: 带_update 更新会对比源数据,如果没做改变,那么什么都不变
不带 _update 不会检查元数据
四、删除数据
1.DETELE:/coustomer/external/id删除为id的数据
贰:进阶
一、SearchAPI
ES支持两种检索:
1.一个是通过使用REST request uri 发送搜索数据(检索参数)
GET bank/_search?q=*&sort=number:asc
2.另一个是通过 REST request body来发送(请求体)
GET bank/_search
{
"query": {
"match_all": {}
},
"sort":[
{
"number:asc"
}
]
}
二、QueryDSL基本使用
match_all:
match全文检索 匹配查询
GET bank/_search
{
"query": {
"match": {
"account_number": "20"
}
}
}
也可以模糊
GET bank/_search
{
"query": {
"match": {
"address": "Kings"
}
}
}
match_phrase短语匹配
image.png
multi_match多字段匹配
image.png
bool复合查询:
加入多种条件
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"gender": "M"
}
},
{
"match": {
"address": "mill"
}
}
],
"must_not": [
{
"match": {
"age": "30"
}
}
],
"should": [
{
"match": {
"lastname": "Wallace"
}
}
]
}
}
}
总结:must 必须满足 must_not 必须不满足 should 可以不满足也可以满足
filter
GET bank/_search
{
"query": {
" filter":{
"range": {
"age": {
"gte": 10,
"lte": 30
}
}
}
}
}
用filter过滤区间就不会如上查询获得相关性得分
term查询
term和match一样是查询
term不适合文本字段查询,精确数组查询推荐用term,文本字段检索推荐使用match
.keyword
精准匹配 代表匹配文本字段的整个精确值(不分词匹配)
aggregations聚合
查出所有年龄分布,并且这些年龄中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
GET bank/_search
{
"query": {"match_all": {}},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"genderAvg": {
"terms": {
"field": "gender.keyword",
"size": 10
},"aggs": {
"genderBanlance": {
"avg": {
"field": "balance"
}
}
}
},
"allBalanceAvg":{
"avg": {
"field": "balance"
}
}
}
}
},
"size": 0
}
mappings映射
可以在第一次保存数据前可以给索引指定映射,创建索引时指定映射
PUT /my_index
{
"mappings":{
"properties" : {
"account_number" : {
"type" : "long"
}
}
}
}
数据迁移
老数据有Type的,需要指定type 没有的就不用指定
POST _reindex
{
"source":{
"index":"bank",
"type" :"account"
},
"dest":{
"index":"newbank"
}
}
分词
分词器自定义文字,减少检索时间
使用nginx配置分词器,
进入 ES的plugins 中修改 ik分词的配置
range 区间查询
GET /_search
{
"query":{
"bool":{
"filter":{
"range":{
"age":{
"gte": 0,
"lte":200
}
}
}
}
}
}
整合SpringBoot
一、导入依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.12.1</version>
</dependency>
二、创建bean容器
@Configuration
public class GulimallElasticSearchConfig {
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient esRestClint(){
RestClientBuilder restClientBuilder = null;
restClientBuilder = RestClient.builder(new HttpHost("192.168.56.22", 9200, "http"));
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder);
return restHighLevelClient;
}
}
三、实现代码案例
package com.atguigu.gulimail.search;
import com.alibaba.fastjson.JSON;
import com.atguigu.gulimail.search.config.GulimallElasticSearchConfig;
import lombok.Data;
import lombok.ToString;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class GulimailSearchApplicationTests {
@Autowired
RestHighLevelClient restHighLevelClient;
@Data
@ToString
static class searchAs{
private int account_number;
private int balance;
private String firstname;
private String lastname;
private int age;
private String gender;
private String address;
private String employer;
private String email;
private String city;
private String state;
}
@Test
public void indexEs() throws IOException {
IndexRequest indexRequest = new IndexRequest("user");
indexRequest.id("1");
User user = new User();
user.setName("张三");
user.setAddUrl("杭州市");
String s = JSON.toJSONString(user);
indexRequest.source(s, XContentType.JSON);
IndexResponse index = restHighLevelClient.index(indexRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
System.out.println(index.toString());
}
@Test
public void search() throws IOException {
//创建检索条件
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("bank");
//检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("address","Bristol"));
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
searchSourceBuilder.aggregation(ageAgg);
searchRequest.source(searchSourceBuilder);
//执行检索
SearchResponse search = restHighLevelClient.search(searchRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
//获取检索数据
SearchHits hits = search.getHits();
SearchHit[] hits1 = hits.getHits();
for (SearchHit documentFields : hits1) {
String sourceAsString = documentFields.getSourceAsString();
searchAs searchAs = JSON.parseObject(sourceAsString, searchAs.class);
System.out.println(searchAs.toString());
}
Aggregations aggregations = search.getAggregations();
Terms terms = aggregations.get("ageAgg");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
}
@Data
class User{
private String name;
private String addUrl;
}
@Test
public void contextLoads() {
System.out.println(restHighLevelClient);
}
}