您现在的位置是:首页 > 正文

springboot整合Elasticsearch简单操作

2024-02-01 05:58:47阅读 8

以下步骤均参考Elasticsearch操作文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

1、导入依赖

<properties>
	<!--修改默认版本号,默认为6版本-->
    <elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.12.1</version>
</dependency>

2、配置

@Configuration
public class ElasticsearchConfig {

    public static final RequestOptions COMMON_OPTIONS;

    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
//        builder.addHeader("Authorization", "Bearer " + TOKEN);
//        builder.setHttpAsyncResponseConsumerFactory(
//                new HttpAsyncResponseConsumerFactory
//                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
        COMMON_OPTIONS = builder.build();
    }

    @Bean
    public RestHighLevelClient esRestClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("192.168.8.110", 9200, "http")));
        return client;
    }

}

3、测试

@Data
public class User{
    private String name;
    private Integer age;
    private String  gender;
}

3.1、数据操作 - - 增改

添加或修改

//添加或修改
@Autowired
private RestHighLevelClient client;

/**
 * 添加或修改
 * @throws IOException
 */
@Test
public void indexData() throws IOException {
    IndexRequest request = new IndexRequest("users");  //等价下面注释的两行代码
   /* IndexRequest request = new IndexRequest();
    request.index("users");*/
    request.id("1");
    User user = new User();
    user.setAge(20);
    user.setName("李四");
    user.setGender("男");
    String jsonString = JSON.toJSONString(user);
    //要保存的内容
    request.source(jsonString, XContentType.JSON);
    //执行操作
    IndexResponse response = client.index(request, ElasticsearchConfig.COMMON_OPTIONS);
    //响应数据
    System.out.println(response);
}

批量添加

//批量添加
@Test
public void bulkData() throws IOException {
    List<User> list = new ArrayList<>();
    //批量操作对象
    BulkRequest bulkRequest = new BulkRequest();
    for (User user : list) {
        //封装批量数据
        IndexRequest request = new IndexRequest("users");
        request.id(user.getId());
        String jsonString = JSON.toJSONString(user);
        request.source(jsonString,XContentType.JSON);
        //添加数据
        bulkRequest.add(request);
    }
    //解析结果
    BulkResponse bulkResponse = client.bulk(bulkRequest, ElasticsearchConfig.COMMON_OPTIONS);
    //是否出现错误
    boolean hasFailures = bulkResponse.hasFailures();

}

3.2、检索

文档地址:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html

3.2.1、简单检索

SDL语法:
在这里插入图片描述
结果:
在这里插入图片描述

@Test
public void searchData() throws IOException {
    // 1、创建检索请求
    SearchRequest request = new SearchRequest();
    // 指定检索索引
    request.indices("bank");
    // DSL,检索条件
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//        searchSourceBuilder.query();
//        searchSourceBuilder.from();
//        searchSourceBuilder.size();
//        searchSourceBuilder.aggregation();
    searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
    System.out.println(searchSourceBuilder.toString());
    request.source(searchSourceBuilder);

    // 2、执行检索
    SearchResponse response = client.search(request, ElasticsearchConfig.COMMON_OPTIONS);
    // 3、分析结果
    System.out.println(response.toString());
}

3.2.2、复杂检索

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

// 此类根据查询结果,在线生成(例如json在线格式化)
@Data
public class Accout {

    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 searchData() throws IOException {
    // 1、创建检索请求
    SearchRequest request = new SearchRequest();
    // 指定检索索引
    request.indices("bank");
    // DSL,检索条件
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    // 1.1)构造检索条件
    searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
    // 1.2)按照年龄的值分布进行聚合操作
    TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
    searchSourceBuilder.aggregation(ageAgg);
    // 1.3) 计算平均工资
    AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
    searchSourceBuilder.aggregation(balanceAvg);

    System.out.println("检索条件:"+searchSourceBuilder.toString());
    request.source(searchSourceBuilder);

    // 2、执行检索
    SearchResponse response = client.search(request, ElasticsearchConfig.COMMON_OPTIONS);
    // 3、分析结果
    System.out.println(response.toString());
    //Map map = JSON.parseObject(response.toString(), Map.class);
    // 3.1) 获取所有查询的记录
    SearchHits hits = response.getHits();
    SearchHit[] searchHits = hits.getHits();
    for (SearchHit searchHit : searchHits) {
        String sourceAsString = searchHit.getSourceAsString();
        Accout accout = JSON.parseObject(sourceAsString, Accout.class);
        System.out.println(accout);
    }
    // 3.2)获取聚合信息
    Aggregations aggregations = response.getAggregations();
    //年龄聚合
    Terms ageAgg1 = aggregations.get("ageAgg");
    for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
        String keyAsString = bucket.getKeyAsString();
        System.out.println("年龄:"+keyAsString);
    }
    //平均工资聚合
    Avg balanceAvg1 = aggregations.get("balanceAvg");
    System.out.println("平均工资:"+balanceAvg1.getValue());
}

3.3、拓展:数据迁移

注意:前提是两个索引的映射是一样的。

PUT product
{
  "mappings": {
    "properties": {
      "skuId": {
        "type": "long"
      },
      "spuId": {
        "type": "keyword"
      },
      "skuTitle": {
        "type": "text",
        "analyzer": "ik_smart"
      }
    }
  }
}
PUT products
{
  "mappings": {
    "properties": {
      "skuId": {
        "type": "long"
      },
      "spuId": {
        "type": "keyword"
      },
      "skuTitle": {
        "type": "text",
        "analyzer": "ik_smart"
      }
    }
  }
}
#数据迁移
POST _reindex
{
  "source": {
    "index": "product" //old_index
  },
  "dest": {
    "index": "products" //new_index
  }
}

网站文章

  • 怎样修改iis 服务器日期,怎么在IIS里设置服务器端缓存时间?

    设置IIS缓存的方法1.测试,可以缓存整个Share工程(经测试IIS中的缓存测试对ASPX页面不起作用,估计与页面压缩的设置原理一样);2.需要设置缓存的工程: Share,Portal(根据IIS...

    2024-02-01 05:58:40
  • 盘点6个实用的Python 技巧

    盘点6个实用的Python 技巧

    每种产品具体的特征都不一样,如果用静态属性的将字典转成对象的话,代码会非常乱而且无法管理,但如果用动态属性的话,下面三行代码就能搞定(用 setattr())。当登录时,你需要输入你的用户名和密码,用...

    2024-02-01 05:58:07
  • SUCTF-2019-EasySQL

    SUCTF-2019-EasySQL

    看一下源代码 Give me your flag, I will tell you if the flag is right.

    2024-02-01 05:58:00
  • 计算机基础知识表格斜线,在WORD中,其中一个表格里画一斜线怎么画?

    计算机基础知识表格斜线,在WORD中,其中一个表格里画一斜线怎么画?

    说的细,所以看起来多,其实很简单。比用word中的插入表头好用多了,word中的插入表头,首限条件太多,比如字数,超过四个字相当费事,调来调去,气死。1、 打开绘图工具栏:右击菜单栏,在绘图前面打上钩...

    2024-02-01 05:57:55
  • 定时网页截图php,浏览器实现网页定时自动截图

    定时网页截图php,浏览器实现网页定时自动截图

    提要:在这里介绍一款软件可以定时的截某一个网站的图片,这种对于关注股票的行走趋势和网购物品的价格变化有一个很好的记录,本文以某东上面的一件物品做案例不少人想了解关于浏览器实现网页定时自动截图这个话题的...

    2024-02-01 05:57:28
  • Java分层领域模型的DO、DTO、DAO、BO、AO、VO、POJO、Query定义

    Java分层领域模型的DO、DTO、DAO、BO、AO、VO、POJO、Query定义

    分层领域模型: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。 DTO( Data Transfer Object):数据传输对象,Service或Mana...

    2024-02-01 05:57:22
  • FreeRtos源码分析之任务切换原理(四)

    FreeRtos源码分析之任务切换原理(四)

    一、CortexM3中断优先级CortexM3支持多达240个外部中断和16个内部中断,每一个中断都对应一个中断都对应一个优先级寄存器。每一个优先级寄存器占用8位,STM32采用其中的高四位来表示优先...

    2024-02-01 05:57:16
  • 路由守卫大全

    路由守卫是一个路由的访问机制,如果允许访问就放行,不允许访问就不放行,可以通过 router.beforeEach() 方法来实现对应的操作。

    2024-02-01 05:57:09
  • html如何修改span的值,如何动态改变div span的内容

    本文介绍了javascript动态改变div span的内容的教程,希望能帮助到大家先看一个实例对span的控制与div类似,但是它是按照行来显示的,看下面的代码:function chagespan...

    2024-02-01 05:56:39
  • Microsoft Word 教程:如何在 Word 中插入图片、图标?

    Microsoft Word 教程:如何在 Word 中插入图片、图标?

    欢迎观看 Microsoft Word 教程,小编带大家学习 Microsoft Word 的使用技巧,了解如何在 Word 中插入图片、图标。

    2024-02-01 05:56:31