首页 > 其他分享 >elasticsearch使用

elasticsearch使用

时间:2024-10-28 15:52:13浏览次数:4  
标签:indexName String 使用 new stu elasticsearch org import

1、选择

1、ElasticsearchRestTemplate是spring 对官方High Level REST Client的封装。
2、ElasticSearch 8.x 弃用了 High Level REST Client,移除了 Java Transport Client,推荐使用 Elasticsearch Java API (后续使用8的建议使用Elasticsearch Java API )

2、ElasticsearchRestTemplate的使用

(1)实体类

@Data
@Document(indexName = "stu", shards = 3, replicas = 0)
public class StuEntity {
    @Id
    private Long stuId;

    @Field(store = true)
    private String name;

    @Field(store = true)
    private Integer age;

    @Field(store = true, type = FieldType.Keyword)
    private String sign;

    @Field(store = true)
    private String description;
}

image
(2)操作
(2.1)普通的增

@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;

@Test
public void add() {
    StuEntity stu = new StuEntity();
    stu.setStuId(1005L);
    stu.setName("iron man");
    stu.setAge(54);
    stu.setSign("I am iron man");
    stu.setDescription("I have a iron army");
    elasticsearchRestTemplate.save(stu);
}

(2.2)普通的查

package com.huyonghao.esapi;

import com.huyonghao.esapi.model.Content;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;

import java.util.List;

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    private ElasticsearchRestTemplate restTemplate;

    @Test
    void jdHighLight() {
        // 高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>").field("title");

        // 分页功能实现  5页
        Pageable pageable = PageRequest.of(0, 5);
        // 排序功能实现
        FieldSortBuilder fieldSortBuilder = new FieldSortBuilder("_score");
		// 条件查询  Match条件
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", "Lebron");

		// Query对象 建造者模式 其中的分页和排序同样看代码可知。
        NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchQueryBuilder).withFields("title", "id", "img", "price")
                .withHighlightBuilder(highlightBuilder).withPageable(pageable).withSort(fieldSortBuilder).build();
		// 查询
        SearchHits<Content> hits = restTemplate.search(query, Content.class);

        List<SearchHit<Content>> searchHits = hits.getSearchHits();
        System.out.println("一共" + searchHits.size() + "个");
        for (SearchHit<Content> searchHit : searchHits) {
            // 遍历返回命中结果
            Content content = searchHit.getContent();
            // 获取高亮字段
            List<String> titleHighLightList = searchHit.getHighlightField("title");
            // 将高亮字段替换查询出的对象中的title
            if (titleHighLightList != null) {
                content.setTitle(titleHighLightList.get(0));
            }

            System.out.println(content);
        }
    }
}

(2.3)普通的改

@Test
public void update() {
    StuEntity stu = new StuEntity();
    stu.setStuId(1005L);
    stu.setName("iron manss");
    stu.setAge(100);
    stu.setSign("I am iron man");
    stu.setDescription("I have a iron army");
    System.out.println(JSON.toJSONString(stu));
    // 创建Document对象
    // 第一种方式
    Document document = Document.create();
    // 将修改的内容塞进去
    document.putAll(JSON.parseObject(JSON.toJSONString(stu), Map.class));

    // 第二种方式
    Document document1 = Document.parse(JSON.toJSONString(stu));

    // 第三种方式
    Document document2 = Document.from(JSON.parseObject(JSON.toJSONString(stu), Map.class));

    // 构造updateQuery
    UpdateQuery updateQuery = UpdateQuery.builder("1")
        // 如果不存在就新增,默认为false
        .withDocAsUpsert(true)
        .withDocument(Document.parse(JSON.toJSONString(stu)))
        .build();
    elasticsearchRestTemplate.update(updateQuery, IndexCoordinates.of("stu"));
}

(2.4)普通的删

@Test
public void delete() {
    StuEntity stu = new StuEntity();
    stu.setStuId(1005L);
    stu.setName("iron man");
    stu.setAge(54);
    stu.setSign("I am iron man");
    stu.setDescription("I have a iron army");
    elasticsearchRestTemplate.delete(stu);
}

查询就调用elasticsearchRestTemplate中SearchOperations`的search方法。

在search的各种方法中都需要传入Query。Spring Data Elasticsearch中Query的实现类CriteriaQuery, StringQuery and NativeSearchQuery

CriteriaQuery基于查询的查询允许创建查询来搜索数据,而无需了解 Elasticsearch 查询的语法或基础知识。它们允许用户通过简单地链接和组合指定搜索文档必须满足的条件的对象来生成查询

StringQuery使用json字符串来构建查询条件。就和Repository中@Query注解中的那个json字符串一样。

NativeSearchQuery用于复杂查询。

(2.5)批量操作

public class ElasticsearchUtil {

    /**
     * 批量插入的数据长度大小
     */
    private final int PAGE_SIZE = 150000;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;


    /**
     * 批量插入数据
     * @return
     */
    public int bulkIndex(String indexName,String indexType,List<BaseEsEntity> dataList){
        int counter = 0;
        checkData(indexName,indexType,dataList);
        //判断索引是否存在
        if (!elasticsearchTemplate.indexExists(indexName)) {
            elasticsearchTemplate.createIndex(indexName);
        }
        List<IndexQuery> indexQueries = convertData(dataList,indexName,indexType);
        elasticsearchTemplate.bulkIndex(indexQueries);
        log.info("bulkIndex counter : " + indexQueries.size());
        counter = indexQueries.size();
        indexQueries.clear();
        dataList.clear();
        elasticsearchTemplate.refresh(indexName);

        return counter;
    }

    private void checkData(String indexName,String indexType,List<BaseEsEntity> dataList){
        if(StringUtils.isBlank(indexName) || StringUtils.isBlank(indexType)){
            throw new RuntimeException("indexName or indexType can not be null");
        }
        if(CollectionUtils.isEmpty(dataList)){
            throw new RuntimeException(String.format("保存的数据不能为空,data size 长度{%d}", dataList.size()));
        }
        if(dataList.size() > PAGE_SIZE){
            throw new RuntimeException(String.format("data size 必须小于{%d},当前长度{%d}", PAGE_SIZE, dataList.size()));
        }
    }

    private List<IndexQuery> convertData(List<BaseEsEntity> dataList,String indexName,String indexType){
        List<IndexQuery> queries = new ArrayList<>();
        for (BaseEsEntity esEntity : dataList) {
            IndexQuery indexQuery = new IndexQuery();
            indexQuery.setId(esEntity.getId());
            indexQuery.setSource(JSONObject.toJSONString(esEntity));
            indexQuery.setIndexName(indexName);
            indexQuery.setType(indexType);
            queries.add(indexQuery);
        }
        return queries;
    }

}

一次插入15万

标签:indexName,String,使用,new,stu,elasticsearch,org,import
From: https://www.cnblogs.com/cgy1995/p/18510808

相关文章

  • C# SuperSocket 基础六【CountSpliterReceiveFilte-固定数量分隔符协议】使用COMMAND
    publicclassCountSpliterReceiveFilterSession:AppSession<CountSpliterReceiveFilterSession>{publicoverridevoidSend(stringmessage){Console.WriteLine("发送消息:"+message);base.Send(message)......
  • 使用单个HTML实现贪吃蛇游戏
    下面是一个使用单个HTML文件实现的简单贪吃蛇游戏的示例。请将以下代码复制并粘贴到一个新的HTML文件中,然后用浏览器打开即可玩游戏。<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,ini......
  • 以学校数据模型为例,掌握在DAS下使用GaussDB
    @目录题目具体操作一、表的创建二、表数据的插入三、数据查询目的:这里以学校数据库模型为例,介绍GaussDB数据库、表等常见操作,以及SQL语法使用的介绍。题目假设A市B学校为了加强对学校的管理,引入了华为GaussDB数据库。在B学校里,主要涉及的对象有学生、教师、班级、院系和课程......
  • 海康私有化视频平台EasyCVR视频设备轨迹回放平台不同品牌网络摄像机怎么搭配使用?
    一、不同品牌的录像机和摄像机可以混搭使用吗?通常情况下,这是可行的:市面上的大多数摄像头和录像设备都兼容ONVIF协议,该协议定义了网络视频的模型、接口、数据类型以及数据交换的方式。ONVIF协议的目的是建立一个网络视频的框架协议,确保不同制造商生产的网络视频产品(例如摄像设备和......
  • MMpretrain使用Tiny ImageNet数据集
    TinyImageNet是ImageNet的子集,ImageNet太大了,训练一次要好几天,于是准备用TinyImageNet代替ImageNet./mmpretrain/mmpretrain/datasets/imagenet.py里面列出了ImageNet的两种格式:imagenet├──train│├──class_x||├─......
  • C# 使用SuperSocket的FixedHeaderReceiveFilter进行通信
    一、服务端publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){MyServerappServer=newMyServer();......
  • Java为什么不使用多继承?
    Java不使用多继承是为了:一、避免菱形继承问题;二、简化代码和维护;三、引入接口实现多继承功能;四、遵循设计原则。避免菱形继承问题可以使代码更加稳健可靠,降低了开发复杂度,从而便于团队协作和维护。一、避免菱形继承问题多继承意味着一个类可以从多个父类继承属性和方法。虽然......
  • C++之OpenCV入门到提高001:使用 Visual Studio2022 配置 OpenCV 环境
    一、介绍从今天开始,我们又要开始一个新的系列了,这个系列就是《C++之Opencv入门到提高》。这个系列是有关如何使用C++语言,通过Opencv来实现图像处理、缺陷检测、视频处理、机器学习等功能。OpenCV我也是新接触的,一步一步的学习,一步一步提高。这个系列是以C++为基......
  • 使用 EXPLAIN 分析结果优化 SQL 查询
    使用EXPLAIN分析结果优化SQL查询是数据库性能调优中的一项重要技能。EXPLAIN语句能够展示数据库查询优化器对SQL查询的处理计划,从而帮助开发者识别查询中的瓶颈和低效部分。本文将详细介绍如何使用EXPLAIN分析结果来优化SQL查询。一、什么是EXPLAINEXPLAIN语......
  • 海康私有化视频平台EasyCVR视频设备轨迹回放平台不同品牌网络摄像机怎么搭配使用?
    一、不同品牌的录像机和摄像机可以混搭使用吗?通常情况下,这是可行的:市面上的大多数摄像头和录像设备都兼容ONVIF协议,该协议定义了网络视频的模型、接口、数据类型以及数据交换的方式。ONVIF协议的目的是建立一个网络视频的框架协议,确保不同制造商生产的网络视频产品(例如摄像设备和......