Elasticsearch基础

news2024/12/26 10:52:26

Elasticsearch是搜索服务器

视频地址:https://www.bilibili.com/video/BV1Sy4y1G7LL/?p=6&spm_id_from=333.880.my_history.page.click&vd_source=fc7fa697b97f292319c5b0cde4755484
下载地址:[https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.4.0-linux-x86_64.tar.gz

数据库搜索缺点](https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.4.0-linux-x86_64.tar.gz)

性能低

在这里插入图片描述

功能瑞

在这里插入图片描述

倒排索引

正向索引

在这里插入图片描述

初识倒排索引

在这里插入图片描述
优化:倒排索引将value修改为对应诗名或者id
在这里插入图片描述

Elasticsearch存储和搜索原理

在这里插入图片描述
在这里插入图片描述

Elasticsearch概念

在这里插入图片描述

Elasticsearch和Mysql的不同点

在这里插入图片描述

Elasticsearch下载部署

这里在本机玩,不介绍linux下集群部署
下载后
进入elasticsearch bin目录下
./elasticsearch -d 后台启动
mac电脑操作查看进程
jps 查看进程端口
sudo lsof -nP -p 进程号| grep LISTEN
linux查看端口
jps
netstat -nltp|grep elasticsearch`
在这里插入图片描述
默认配置为9200端口为http请求
9300断后为tcp elasticsearch内部通信
访问9200成功即为elasticsearch启动成功
在这里插入图片描述

Elasticsearch核心概念

索引,映射,文档
在这里插入图片描述

脚本操作ES

基于RESTful风格

操作索引

1.查看es安装成功

GET http://127.0.0.1:9200
在这里插入图片描述

2.添加索引

PUT http://127.0.0.1:9200/goods
在这里插入图片描述

3.查看指定索引信息及所有索引

GET http://127.0.0.1:9200/goods
在这里插入图片描述
GET http://127.0.0.1:9200/_all
在这里插入图片描述

4.删除指定索引

DELETE http://127.0.0.1:9200/goods2
在这里插入图片描述

5.关闭索引

POST http://127.0.0.1:9200/goods/_close
在这里插入图片描述

6.开启索引

POST http://127.0.0.1:9200/goods/_open
在这里插入图片描述

操作映射

简单数据类型

字符串:
在这里插入图片描述
数值:
在这里插入图片描述
布尔
在这里插入图片描述
二进制
在这里插入图片描述
范围类型
在这里插入图片描述
日期
在这里插入图片描述

复杂数据类型

数组
对象
在这里插入图片描述

添加映射

PUT http://127.0.0.1:9200/person/_mapping

{
    "properties":{
        "name":{
            "type":"keyword"
        },
        "age":{
            "type":"integer"
        }
    }
}

在这里插入图片描述

查询映射

GET http://127.0.0.1:9200/person/_mapping
在这里插入图片描述

添加索引的同时添加映射

PUT http://127.0.0.1:9200/person

{
    "mappings":{
    "properties":{
        "name":{
            "type":"keyword"
        },
        "age":{
            "type":"integer"
        }
    }
    }
}

在这里插入图片描述

添加字段

PUT http://127.0.0.1:9200/person/_mapping

{
    "properties":{
        "address":{
            "type":"text"
        }
    }
}

在这里插入图片描述

操作文档

添加文档

添加文档指定文档id

PUT http://127.0.0.1:9200/person/_doc/1

{
    "name":"张三",
    "age":20,
    "address":"北京"
}

在这里插入图片描述

添加文档不指定文档id

POST http://127.0.0.1:9200/person/_doc/

{
    "name":"李四",
    "age":18,
    "address":"朝阳"
}

在这里插入图片描述

查询文档

根据id查询文档

GET http://127.0.0.1:9200/person/_doc/8uh0bYgBAYb4xsq8VhGD
在这里插入图片描述

查询索引下的所有文档

PUT http://127.0.0.1:9200/person/_doc/_search
在这里插入图片描述

修改文档

PUT http://127.0.0.1:9200/person/_doc/1

{
    "name":"张飞",
    "age":20,
    "address":"北京"
}

在这里插入图片描述

删除文档

根据id删除文档

DELETE http://127.0.0.1:9200/person/_doc/1

在这里插入图片描述

分词器

es内置分词器对中文很不友好
在这里插入图片描述

测试

GET http://127.0.0.1:9200/_analyze

{
    "analyzer":"standard",
    "text":"我爱北京天安门"
}

在这里插入图片描述

下载ik分词器

ik分词器和es适配版本
在这里插入图片描述
这里用的es为7.17.10所以ik分词器下载地址为
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.17.1
下载完后放入es的plugin目录下
在这里插入图片描述
将解压的elasticsearch-analysis-ik-7.17.1下的文件cp到plugin/analysis-ik下
cp -r /Users/hejiawang/elasticsearch-7.17.10/plugins/analysis-ik/elasticsearch-analysis-ik-7.17.1/* /Users/hejiawang/elasticsearch-7.17.10/plugins/analysis-ik
将ik分词器下的config文件copy到es的config目录下
cp -r /Users/hejiawang/elasticsearch-7.17.10/plugins/analysis-ik/elasticsearch-analysis-ik-7.17.1/config/* /Users/hejiawang/elasticsearch-7.17.10/config
在这里插入图片描述
在这里插入图片描述
重启es
启动es报错
在这里插入图片描述
vi /Users/hejiawang/elasticsearch-7.17.10/plugins/analysis-ik/plugin-descriptor.properties
将elasticsearch.version=7.17.1 改为elasticsearch.version=7.17.10
在这里插入图片描述
再次重启

使用ik分词器

ik_smart粗力度分词

GET http://127.0.0.1:9200/_analyze

{
    "analyzer":"ik_smart",
    "text":"我爱北京天安门"
}

在这里插入图片描述

ik_smart细力度分词

GET http://127.0.0.1:9200/_analyze

{
    "analyzer":"ik_max_word",
    "text":"我爱北京天安门"
}

在这里插入图片描述

查询文档

词条查询

词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配搜索

全文查询

全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集

Demo演示

指定索引查询所有数据 有一条数据
在这里插入图片描述
按词条查询文档
因为查询条件为北京,es默认address使用默认分词器,分词为北,京,朝,阳 无法匹配,除非创建mapping时候指定address映射为ik_max_word即可查到
GET http://127.0.0.1:9200/person/_search

{
    "query":{
        "term":{
            "address":{
                "value":"北京"
            }
        }
    }
}

在这里插入图片描述
全文查询
GET http://127.0.0.1:9200/person/_search

{
    "query":{
        "match":{
            "address": "北京"
        }
    }
}

在这里插入图片描述

JAVA操作ES

Springboot整合ES

创建Springboot项目

1.引入pom

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.17.1</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.17.1</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.17.1</version>
        </dependency>

2.创建自动装在配置类

package com.hejiawang.elasticsearch.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticsearchConfig  {
    private String host;
    private int port;
    public void setHost(String host) {
        this.host = host;
    }

    public void setPort(int port) {
        this.port = port;
    }

    @Bean
    public RestHighLevelClient client(){
        return new RestHighLevelClient(RestClient.builder(new HttpHost(host,port,"http")));
    }
}

3.创建application.yml并且加上配置

elasticsearch:
  host: 127.0.0.1
  port: 9200

4.创建测试类

package com.hejiawang.elasticsearch;

import com.hejiawang.elasticsearch.config.ElasticsearchConfig;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ElasticsearchApplicationTests {
    @Autowired
    RestHighLevelClient client;
    @Test
    void contextLoads() {
//        1.创建es客户端对象
//        RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200,"http")));
        System.out.println(client);
    }
}

javaAPI操作ES

添加索引

添加索引不指定mapping

    /*添加索引*/
    @Test
    public void addIndex() throws IOException {
//        1.使用client获取操作索引对象
        IndicesClient indices = client.indices();
//        2.具体操作返回值
        CreateIndexRequest createRequest =  new CreateIndexRequest("test_hejiawang");
        CreateIndexResponse response = indices.create(createRequest, RequestOptions.DEFAULT);
//        3.根据返回值判断结果
        System.out.println(response.isAcknowledged());
    }

在这里插入图片描述

添加索引指定mapping

    /*添加索引*/
    @Test
    public void addIndex() throws IOException {
//        1.使用client获取操作索引对象
        IndicesClient indices = client.indices();
//        2.具体操作返回值
        CreateIndexRequest createRequest =  new CreateIndexRequest("test_hejiawang2");
//        2.1设置mapping
        String mapping = "{\n" +
                "    \"properties\":{\n" +
                "        \"name\":{\n" +
                "            \"type\":\"keyword\"\n" +
                "        },\n" +
                "        \"age\":{\n" +
                "            \"type\":\"integer\"\n" +
                "        }\n" +
                "    }\n" +
                "}";
        createRequest.mapping(mapping, XContentType.JSON);
        CreateIndexResponse response = indices.create(createRequest, RequestOptions.DEFAULT);
//        3.根据返回值判断结果
        System.out.println(response.isAcknowledged());
    }

在这里插入图片描述

查询索引

    /*查询索引*/
    @Test
    public void queryIndex() throws IOException {
        //        1.使用client获取操作索引对象
        IndicesClient indices = client.indices();
        GetIndexRequest getRequest = new GetIndexRequest("test_hejiawang2");
        GetIndexResponse response = indices.get(getRequest, RequestOptions.DEFAULT);
//        获取结果
        Map<String, MappingMetadata> mappings = response.getMappings();
        for (String key : mappings.keySet()){
            System.out.println(key+":"+mappings.get(key).getSourceAsMap());
        }
    }

在这里插入图片描述

删除索引

    /*删除索引*/
    @Test
    public void deleteIndex() throws IOException {
        //        1.使用client获取操作索引对象
        IndicesClient indices = client.indices();
        DeleteIndexRequest deleteRequest = new DeleteIndexRequest("test_hejiawang2");
        AcknowledgedResponse response = indices.delete(deleteRequest, RequestOptions.DEFAULT);
//        3.根据返回值判断结果
        System.out.println(response.isAcknowledged());
    }

在这里插入图片描述

判断索引是否存在

    /*判断索引是否存在*/
    @Test
    public void existIndex() throws IOException {
        //        1.使用client获取操作索引对象
        IndicesClient indices = client.indices();
        GetIndexRequest request = new GetIndexRequest("test_hejiawang2");
        boolean exists = indices.exists(request, RequestOptions.DEFAULT);
//        3.根据返回值判断结果
        System.out.println(exists);
    }

在这里插入图片描述

添加文档

添加文档使用map作为数据

    /*添加文档*/
    @Test
    public void addDoc() throws IOException {
//        1.获取操作文档的对象
        Map data = new HashMap<>();
        data.put("name","张三");
        data.put("age",18);
        IndexRequest request = new IndexRequest("test_hejiawang2").id("1").source(data);
        IndexResponse response = client.index(request, RequestOptions.DEFAULT);
//        2.获取结果
        System.out.println(response.getId());
    }

在这里插入图片描述

添加文档使用对象作为数据

创建Person对象

    /*添加文档,使用对象作为数据*/
    @Test
    public void addDoc2() throws IOException {
//        1.获取操作文档的对象
        Person person = new Person();
        person.setName("王五");
        person.setAge(19);
//        将对象转为Json
        String data = JSON.toJSONString(person);
        IndexRequest request = new IndexRequest("test_hejiawang2").id("1").source(data,XContentType.JSON);
        IndexResponse response = client.index(request, RequestOptions.DEFAULT);
//        2.获取结果
        System.out.println(response.getId());
    }

在这里插入图片描述

修改文档

    /*修改文档,如果id存在为添加文档,如果id不存在为修改文档*/
    @Test
    public void updateDoc() throws IOException {
//        1.获取操作文档的对象
        Person person = new Person();
        person.setName("王五");
        person.setAge(19);
//        将对象转为Json
        String data = JSON.toJSONString(person);
        IndexRequest request = new IndexRequest("test_hejiawang2").id("1").source(data,XContentType.JSON);
        IndexResponse response = client.index(request, RequestOptions.DEFAULT);
//        2.获取结果
        System.out.println(response.getId());
    }

根据id查询文档

    /*根据id查询文档*/
    @Test
    public void findDocById() throws IOException {
         GetRequest request = new GetRequest("test_hejiawang2","1");
        GetResponse response = client.get(request, RequestOptions.DEFAULT);
//        2.获取结果
        System.out.println(response.getSourceAsString());
    }

在这里插入图片描述

删除文档

    /*根据id删除文档*/
    @Test
    public void deleteDocById() throws IOException {
        DeleteRequest request = new DeleteRequest("test_hejiawang2", "1");
        DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
//        2.获取结果
        System.out.println(response.getId());
    }

在这里插入图片描述

ES高级操作

批量操作

批量操作api调用

在这里插入图片描述
批量增删改查
POST http://127.0.0.1:9200/_bulk
postmain中最后一定要有个空行,不然会报错

{"delete":{"_index":"test_hejiawang2","_id":"1"}}
{"create":{"_index":"test_hejiawang2","_id":"2"}}
{"name":"何佳旺","age":18}
{"update":{"_index":"test_hejiawang2","_id":"1"}}
{"doc":{"name":"zzz"}}

在这里插入图片描述

批量操作java代码

    @Test
    public void testBulk() throws IOException {
//        创建bulkrequest对象
        BulkRequest request = new BulkRequest();
//         添加操作
//        1.删除1号记录
        DeleteRequest deleteRequest = new DeleteRequest("test_hejiawang2","1");
        request.add(deleteRequest);
//        2.添加6号记录
        Map map = new HashMap<>();
        map.put("name","飞哥");
        IndexRequest indexRequest = new IndexRequest("test_hejiawang2").id("6").source(map);
        request.add(indexRequest);
//        3.修改6号记录
        Map map2 = new HashMap();
        map2.put("name","肥哥");
        UpdateRequest updateRequest = new UpdateRequest("test_hejiawang2","6").doc(map2);
        request.add(updateRequest);
//        添加操作
        BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
        RestStatus status = response.status();
        System.out.println(status);
    }

在这里插入图片描述

导入数据

1.mysql创建表

CREATE TABLE goods(
    id bigint(20),
    title varchar(100),
    price decimal(20,2),
    stock int(10),
    saleNum int(10),
    creatTime dateTime,
    categoryName varchar(200),
    brandName varchar(100),
    spec varchar(200)
)

2.es创建索引

PUT http://127.0.0.1:9200/goods

{
    "mappings":{
        "properties":{
            "titles":{
                "type": "text",
                "analyzer":"ik_smart"
            },
            "price":{
                "type": "double"
            },
            "createTime":{
                "type": "date"
            },
            "categoryName":{
                "type": "keyword"
            },
            "brandName":{
                "type": "keyword"
            },
            "spec":{
                "type": "object"
            },
            "saleNum":{
                "type": "integer"
            },
            "stock":{
                "type": "integer"
            }
        }
    }
}

3.在数据库中准备数据数据

insert into 3309test.goods (`id`, `title`, `price`, `stock`, `saleNum`, `creatTime`, `categoryName`, `brandName`, `spec`) values (1, '华为5G', 2399, null, 38, NOW() , '手机', '华为', '{"机身内存":"16g","网络":"联通2G"}');
insert into 3309test.goods (`id`, `title`, `price`, `stock`, `saleNum`, `creatTime`, `categoryName`, `brandName`, `spec`) values (2, '苹果 1', 2399, null, 38, NOW() , '手机', '苹果', '{"机身内存":"16g","网络":"联通2G"}');

4.引入相关依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.4</version>
        </dependency>
                <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

5.准备domain

package com.hejiawang.elasticsearch.domain;

import com.alibaba.fastjson.annotation.JSONField;

import java.util.Date;
import java.util.Map;

public class Goods {
    private int id;
    private String title;
    private double price;
    private int stock;
    private int saleNum;
    private Date creatTime;
    private String categoryName;
    private String brandName;
    private Map spec;
    @JSONField(serialize = false) //在转换JSON时忽略该字段
    private String specStr; //接受数据库的信息"{}"

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getStock() {
        return stock;
    }

    public void setStock(int stock) {
        this.stock = stock;
    }

    public int getSaleNum() {
        return saleNum;
    }

    public void setSaleNum(int saleNum) {
        this.saleNum = saleNum;
    }

    public Date getCreatTime() {
        return creatTime;
    }

    public void setCreatTime(Date creatTime) {
        this.creatTime = creatTime;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public Map getSpec() {
        return spec;
    }

    public void setSpec(Map spec) {
        this.spec = spec;
    }

    public String getSpecStr() {
        return specStr;
    }

    public void setSpecStr(String specStr) {
        this.specStr = specStr;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", price=" + price +
                ", stock=" + stock +
                ", saleNum=" + saleNum +
                ", creatTime=" + creatTime +
                ", categoryName='" + categoryName + '\'' +
                ", brandName='" + brandName + '\'' +
                ", spec=" + spec +
                ", specStr='" + specStr + '\'' +
                '}';
    }
}

6.准备mapper及xml

GoodMapper

package com.hejiawang.elasticsearch.mapper;

import com.hejiawang.elasticsearch.domain.Goods;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Mapper
public interface GoodsMapper {
    /*
    * 查询所有
    * */
    public List<Goods> findAll();
}

GoodMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.hejiawang.elasticsearch.mapper.GoodsMapper">
    <select id="findAll" resultType="goods">
        select id,
               title,
               price,
               stock,
               saleNum,
               creatTime,
               categoryName,
               brandName,
               spec as specStr
        from goods
    </select>
</mapper>

7.BulkRequest批量导入数据

    /*
    * 2.批量导入
    * */
    @Test
    public void importData() throws IOException {
//        1.查询所有数据,mysql
        List<Goods> goodsList = goodsMapper.findAll();
//        goodsList.forEach(n-> System.out.println(n.toString()));
//        2.导入数据
        BulkRequest bulkRequest = new BulkRequest();
//        2.1循环goodsList,创建IndexRequest添加数据
        for (Goods goods : goodsList) {
//            2.2设置spec规格信息,Map的数据 specStr{}
            goods.setSpec(JSON.parseObject(goods.getSpecStr(),Map.class));
//            System.out.println(goods.toString());
//            System.out.println(JSON.toJSONString(goods));
            IndexRequest indexRequest = new IndexRequest("goods");
            indexRequest.id(goods.getId()+"").source(JSON.toJSONString(goods), XContentType.JSON);
            bulkRequest.add(indexRequest);
        }
        BulkResponse response = client.bulk(bulkRequest,RequestOptions.DEFAULT);
    }

8.执行导入结果

在这里插入图片描述

各种查询

matchAll查询

在这里插入图片描述

matchALL脚本查询

GET http://127.0.0.1:9200/goods/_search
默认显示10条数据

{
    "query":{
        "match_all":{}
    }
}

在这里插入图片描述
分页需要带上from,size

{
    "query":{
        "match_all":{}
    },
    "from":0,
    "size":100
}

matchAll javaAPI操作

    /*
    * 查询所有
    * 1.matchAll
    * 2.将查询结果分装为Goods对象,封装到list中
    * 3.分页,默认为10条
    * */
    @Test
   public void testMatchAll() throws IOException {
//        1.构建查询条件构造器,指定查询索引名称
        SearchRequest searchRequest = new SearchRequest("goods");
//        2.创建查询条件构造对象
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//        添加分页信息
        sourceBuilder.from(0);
        sourceBuilder.size(100);
//        3.指定查询条件
        MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); //查询所有文档
        sourceBuilder.query(queryBuilder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
//        4.获取命中对象
        SearchHits searchHits = response.getHits();
//        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);

//        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
    }

在这里插入图片描述

term查询

在这里插入图片描述

term脚本查询

GET http://127.0.0.1:9200/goods/_search

{
    "query":{
        "term":{
            "categoryName":{
                "value":"手机"
            }
        }
    }
}

在这里插入图片描述

termAPI查询

    /**
     * termQuery:词条查询
     */
    @Test
    public void testTermQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        TermQueryBuilder queryBuilder = QueryBuilders.termQuery("categoryName","手机"); //term词条查询
        sourceBuilder.query(queryBuilder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
        SearchHits searchHits = response.getHits();
        //        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);
        //        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
    }

在这里插入图片描述

match查询

在这里插入图片描述

match脚本查询

GET http://127.0.0.1:9200/goods/_search

{
    "query":{
        "match":{
            "title":{
                "query":"三星",
                "operator":"and"
            }
        }
    }
}

在这里插入图片描述

match API查询

    /**
     * termQuery:Match查询
     */
    @Test
    public void testMatchQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title","三星"); //match词条查询
        queryBuilder.operator(Operator.AND); //求并集
        sourceBuilder.query(queryBuilder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
        SearchHits searchHits = response.getHits();
        //        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);
        //        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
    }

在这里插入图片描述

其他查询

模糊查询脚本

在这里插入图片描述

模糊查询API

    /**
     * wildQuery:模糊查询
     */
    @Test
    public void testWildcardQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        WildcardQueryBuilder queryBuilder = QueryBuilders.wildcardQuery("title","三*"); 
        sourceBuilder.query(queryBuilder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
        SearchHits searchHits = response.getHits();
        //        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);
        //        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
    }

在这里插入图片描述

正则查询脚本

在这里插入图片描述

正则查询API

    /**
     * RegexpQuery:正则查询
     */
    @Test
    public void testRegexpQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        RegexpQueryBuilder queryBuilder = QueryBuilders.regexpQuery("title","\\w+(.)*"); //
        sourceBuilder.query(queryBuilder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
        SearchHits searchHits = response.getHits();
        //        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);
        //        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
    }

前缀查询脚本

在这里插入图片描述

前缀查询API

    /**
     * PrefixQuery:前缀查询
     */
    @Test
    public void testPrefixQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        PrefixQueryBuilder queryBuilder = QueryBuilders.prefixQuery("title","三"); //match词条查询
        sourceBuilder.query(queryBuilder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
        SearchHits searchHits = response.getHits();
        //        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);
        //        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
    }

在这里插入图片描述

范围查询脚本

在这里插入图片描述
在这里插入图片描述

范围查询API

    /**
     * rangeQuery:范围查询
     */
    @Test
    public void testPrefixQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        RangeQueryBuilder queryBuilder = QueryBuilders.rangeQuery("price");
        queryBuilder.gte(2000);
        queryBuilder.lte(3000);
        sourceBuilder.query(queryBuilder);
//        排序
        sourceBuilder.sort("price", SortOrder.ASC);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
        SearchHits searchHits = response.getHits();
        //        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);
        //        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
    }

queryString脚本查询

在这里插入图片描述在这里插入图片描述

queryString API

    /**
     * queryString:范围查询
     */
    @Test
    public void testQueryString() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("三星").field("title").field("brandName").defaultOperator(Operator.OR);
        sourceBuilder.query(queryBuilder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
        SearchHits searchHits = response.getHits();
        //        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);
        //        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
    }

在这里插入图片描述

布尔查询脚本

在这里插入图片描述
在这里插入图片描述

聚合查询脚本

在这里插入图片描述
在这里插入图片描述

聚合查询API

    /**
     * 聚合查询:桶聚合,分词查询
     * 1.查询title包含手机的数据
     * 2.查询品牌列表
     */
    @Test
    public void testAggQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//        1.查询title包含三星的数据
        MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "三星");
        sourceBuilder.query(queryBuilder);
//        2.查询品牌列表
        /*
        * 参数
        *   1.自定义的名称,将来用于获取数据
        *   2.分组的字段
        * */
        TermsAggregationBuilder builder = AggregationBuilders.terms("goods_brands").field("brandName").size(100);
        sourceBuilder.aggregation(builder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
        SearchHits searchHits = response.getHits();
        //        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);
        //        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
//        获取聚合结果
        Aggregations aggregations = response.getAggregations();
        Map<String, Aggregation> aggregationMap = aggregations.asMap();
//        System.out.println(aggregationMap);
        Terms goodsBrands = (Terms) aggregationMap.get("goods_brands");
        List<? extends Terms.Bucket> buckets = goodsBrands.getBuckets();
        List brands = new ArrayList();
        for (Terms.Bucket bucket: buckets){
            Object key = bucket.getKey();
            brands.add(key);
        }
        brands.forEach(System.out::println);
    }

在这里插入图片描述

高亮查询脚本

在这里插入图片描述

高亮查询API

    /**
     * 高亮查询:
     * 1.查询title包含手机的数据
     *  高亮字段
     *  前缀
     *  后缀
     *  2.讲高亮了的字段数据替换原有数据
     */
    @Test
    public void testHighLightQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//        1.查询title包含三星的数据
        MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "苹果");
        sourceBuilder.query(queryBuilder);
//        2.设置高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
//        设置三要素
        highlightBuilder.field("title");
        highlightBuilder.preTags("<front color='red'>");
        highlightBuilder.postTags("</front>");
        sourceBuilder.highlighter(highlightBuilder);
//        2.查询品牌列表
        /*
         * 参数
         *   1.自定义的名称,将来用于获取数据
         *   2.分组的字段
         * */
        TermsAggregationBuilder builder = AggregationBuilders.terms("goods_brands").field("brandName").size(100);
        sourceBuilder.aggregation(builder);
        searchRequest.source(sourceBuilder);
        SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT);
        SearchHits searchHits = response.getHits();
        //        5.获取总记录数
        long value = searchHits.getTotalHits().value;
        System.out.println("总记录数:"+value);
        //        获取Hits数据 数组
        List<Goods> goodsList = new ArrayList<>();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit:hits){
//           获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
//            System.out.println(sourceAsString);
//            转为json对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
//            获取高亮结果,替换goods中的title
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField highlightField = highlightFields.get("title");
            Text[] fragments = highlightField.fragments();
//            替换
            goods.setTitle(fragments[0].toString());
            goodsList.add(goods);
        }
        goodsList.forEach(System.out::println);
//        获取聚合结果
        Aggregations aggregations = response.getAggregations();
        Map<String, Aggregation> aggregationMap = aggregations.asMap();
//        System.out.println(aggregationMap);
        Terms goodsBrands = (Terms) aggregationMap.get("goods_brands");
        List<? extends Terms.Bucket> buckets = goodsBrands.getBuckets();
        List brands = new ArrayList();
        for (Terms.Bucket bucket: buckets){
            Object key = bucket.getKey();
            brands.add(key);
        }
        brands.forEach(System.out::println);
    }

索引别名和重建索引

重建索引

1.创建V1索引

PUT http://127.0.0.1:9200/student_index_v1

{
    "mappings":{
        "properties":{
            "birthday":{
                "type":"date"
            }
        }
    }
}

2.往V1索引中插入数据

PUT http://127.0.0.1:9200/student_index_v1/_doc/1

{
    "birthday":"2000-11-21"
}

在这里插入图片描述

3.创建V2的索引

PUT http://127.0.0.1:9200/student_index_v2

{
    "mappings":{
        "properties":{
            "birthday":{
                "type":"date"
            }
        }
    }
}

4.将V1索引中的数据copy到V2索引中

PUT http://127.0.0.1:9200/_reindex

{
    "source":{
        "index":"student_index_v1"
    },
    "dest":{
        "index":"student_index_v2"
    }
}

在这里插入图片描述

对索引取别名

POST http://127.0.0.1:9200/student_index_v2/_alias/student_index_v3
在这里插入图片描述

ES集群管理

ES集群概念

在这里插入图片描述

ES分布式基本概念

在这里插入图片描述

ES分片原则及主机节点预估

在这里插入图片描述

ES路由原则

在这里插入图片描述

ES脑裂

脑裂原因

在这里插入图片描述

避免脑裂

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

赋予品牌文化原力,从已有文化中挖掘

赋予品牌以文化原力&#xff0c;从已有文化中挖掘 华与华总结为&#xff1a; 寻找母体&#xff0c;寄生母体&#xff0c;成为母体&#xff0c;壮大母体 非常经典的例子&#xff1a;微信红包 趣讲大白话&#xff1a;文化有持续的力量 【趣讲信息科技186期】 *******************…

Redisson看门狗机制为什么比将锁设置成永久有效期更好?

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

【测绘程序设计】C#伪距单点定位

文章目录 一、题目解读二、界面设计三、矩阵计算实现1、矩阵定义Matrix2、矩阵构造Matrix()3、单位矩阵MatrixE()4、加减乘操作符重载-*5、矩阵转置transposs()6、矩阵求逆Inverse() 四、数据存储结构设计1、Sat类存一颗卫星的数据2、Epoch类存一个历元的数据3、DataCenter类存…

Spring Cloud Alibaba - Sentinel(一)

目录 一、Sentinel介绍 1、什么是Sentinel 2、Sentinel好处 3、Sentinel下载和安装 二、搭建Sentinel项目 1、创建项目cloudalibaba-sentinel-service8401 三、Sentinel流控规则 1、流控规则基本介绍 2、新增流控 2.1、QPS直接失败案例 2.2、线程数直接失败案例 3、…

CF1839B Lamps

思路 这道题我们可以利用贪心的思想。 我们这里把 a i a_i ai​理解为第 a i a_i ai​层灯。 在层数相同的灯被破坏之后&#xff0c;灯的个数就会减少到 0 0 0&#xff0c;所以它一定不会影响到之后下一层的灯。 所以&#xff0c;我们贪心的思路是&#xff1a; 将每一层&am…

FreeRTOS学习(五)

延时函数 vTaskDelay()&#xff1a;相对延时&#xff0c;指每次延时都是从执行函数vTaskDelay()开始&#xff0c;直到延时指定的时间结束。vTaskDelayUntil()&#xff1a;绝对延时&#xff0c;整个任务的运行周期看成一个整体&#xff0c;适用于需要按照一定频率运行的任务。 …

卡尔曼滤波与组合导航原理笔记(一)第二部分 卡尔曼滤波方程的推导

文章目录 三、卡尔曼滤波1、随机系统状态空间模型2、状态预测3、状态量测4、增益矩阵K与状态估计5、Kalman滤波公式汇总6、Kalman滤波流程图1.划分为左右两部分&#xff08;一阶矩和二阶矩&#xff09;2.划分为上下两部分&#xff08;时间更新、量测更新&#xff09; 7、Kalman…

Windows11安装kohya_ss详细步骤(报错、踩坑)

文章目录 笔者环境所需环境安装kohya_ss方式一&#xff1a;带有GUI的kohya_ss仓库方式二&#xff1a;kohya_ss核心仓库 笔者环境 OS&#xff1a;windows11Python&#xff1a;3.10.6CUDA11.6 所需环境 Python3.10.6GitCUDA11.6 安装kohya_ss 方式一&#xff1a;带有GUI的ko…

mybatis执行流程分析

mybatis全局配置文件 mybatis全局配置文件中涉及的标签如下图所示 配置文件解析 public static void main(String[] args) throws IOException {// 读取配置文件InputStream is Resources.getResourceAsStream("org/apache/ibatis/builder/MapperConfig1.xml");//…

chatgpt赋能python:Python多种颜色——提升SEO排名的技巧

Python多种颜色——提升SEO排名的技巧 在网站设计中&#xff0c;使用多种颜色可以提高用户体验和页面美观度。但你是否知道使用多种颜色还可以提高SEO排名呢&#xff1f;本文将介绍如何在Python代码中使用多种颜色来提高你的SEO排名。 什么是SEO&#xff1f; SEO的全称为“S…

chatgpt赋能python:Python备份文件夹:保障数据安全的最佳方法

Python备份文件夹&#xff1a;保障数据安全的最佳方法 数据备份是确保所有重要信息安全的关键部分。对于IT专业人士和计算机爱好者而言&#xff0c;文件夹备份是一项必不可少的任务。而Python是备份文件夹最流行的语言之一&#xff0c;因为它易于学习和使用。 在这篇文章中&am…

stable-diffusion基础问题记录

一、windows安装 1、启动 如果自己是anaconda&#xff0c;python版本不是3.10.6 conda create -n python_3_10_6 python3.10.6&#xff0c;创建一个这样的环境 修改webui-user.bat set PYTHOND:/software/Anaconda3/envs/python_3_10_6/python&#xff0c;把python换成这个…

【走进Linux的世界】Linux---基本指令(3)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 date指令cal指…

12代CPU启用SR-IOV vGPU,实现一台电脑当七台用

背景 虚拟桌面基础设施&#xff08;VDI&#xff09;技术一般部署在服务器&#xff0c;可以实现多个用户连接到服务器上的虚拟桌面。随着桌面计算机性能的日益提升&#xff0c;桌面计算机在性能在很多场景下已经非常富余&#xff0c;足够同时满足多个用户同时使用的需求。实际项…

Redis的持久化详解

目录 一、Redis的持久化二、RDB&#xff08;Redis DataBase&#xff09;1、RDB快照原理2、RDB配置3、redis.conf 其他一些配置4、RDB的备份恢复5、RDB优缺点 三、AOF&#xff08;Append Of File&#xff09;1、AOF原理2、AOF配置3、AOF的备份恢复4、重写流程5、AOF优缺点 四、A…

MySQL | Windows服务器部署ZIP免安装版MySQL8.0+数据库笔记

Windows服务器部署ZIP免安装版MySQL8.0数据库笔记 文章目录 Windows服务器部署ZIP免安装版MySQL8.0数据库笔记下载MySQL压缩包编写配置文件环境变量初始化数据库安装MySQL服务安装错误&#xff1a;VCRUNTIME140_1.dll 登录 MySQL 下载MySQL压缩包 打开官网的下载页面&#xff…

POI报表的入门

POI报表的入门 理解员工管理的的业务逻辑 能够说出Eureka和Feign的作用 理解报表的两种形式和POI的基本操作熟练使用POI完成Excel的导入导出操作 员工管理 需求分析 企业员工管理是人事资源管理系统中最重要的一个环节&#xff0c;分为对员工入职&#xff0c;转正&#xff0c;离…

chatgpt赋能python:Python如何处理AI文件

Python如何处理AI文件 什么是AI文件&#xff1f; AI文件是Adobe Illustrator的标准文件格式。它包含了图形设计师所创建的矢量图形&#xff0c;这些矢量图形可以根据需要进行缩放和文件大小的调整。AI文件是专业印刷和设计领域中最常用的格式之一。 为什么要处理AI文件&…

深入ReentrantReadWriteLock

ReentrantReadWriteLock出现的原因 首先synchronized和ReentrantLock都是互斥锁&#xff0c;一个线程在获取锁资源之后另一个线程只能等待假设有一种情况是读多写少&#xff0c;并且确保线程安全。可以使用ReentrantReadWriteLock实现ReentrantReadWriteLock的特点是读读不互斥…

基于随身wifi的Tiny linux debian搭建教程

基于随身wifi的Tiny linux debian搭建教程 基于随身wifi的Tiny linux debian搭建教程基本信息进9008miko备份Qualcomm Premium Tool全分区备份 开adb刷debianssh连接扩展应用原版镜像测速ServerBox自动登录校园网 bug 基于随身wifi的Tiny linux debian搭建教程 基本信息 12芯…