java调用elasticSearch api

news2024/12/28 18:44:54

java操作es有两种方式

  1. 通过操作es的9300端口,9300是tcp端口,集群节点之间通信也是通过9300端口,会通过9300和es建立一个长连接,下面的es的依赖可以直接操作

    但是随着es的版本的提升spring-data需要封装不同版本的es的jar包,好像还没封装到这个版本(2019),另外官方也不推荐通过9300来操作es,而且这种方式在es8以后将被废弃

  2. 通过9200操作,发送http请求

    1. JestClient,非官方,更新慢
    2. RestTemplate(springboot),模拟发http请求,es很多操作需要自己封装,麻烦
    3. HttpCLient,同上
    4. Elasticsearch-Rest-Client,官方RestClient,封装了ES操作,API层次分明,上手简单

我们在浏览官方文档的时候发现,js可以直接操作es,那为什么我们不直接用js来操作es呢?

  1. 出于安全,因为es集群属于后端集群服务器,端口一般不对外暴露,如果对外暴露,会被别人恶意利用

  2. js对es支持度有些低,我们如果用js操作的话,不需要通过官网提供的api,我们直接发送ajax请求,用原生es语句即可

其中,官网的java api是通过9300来操作的,java rest api是通过9200来操作的

官网中有Java Low Level REST ClientJava High Level REST Client,关系就和mybatis和jdbc一样

Elasticsearch-Rest-Client(官方,推荐)

这个不是专门看视频学习的,是谷粒商城的时候,跟着老师敲的,所以其实就是一个对谷粒商城涉及到这块儿的一个总结,版本什么的自然也就是用的它的。

这算是我总结的一个api,没有真实对照的使用过,只是为了理清思路。

maven

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.atlinxi.gulimall</groupId>
    <artifactId>gulimall-search</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gulimall-search</name>
    <description>elasticsearch检索服务</description>
    <properties>
        <java.version>1.8</java.version>
        <elasticsearch.version>7.4.2</elasticsearch.version>
        <spring-cloud.version>2020.0.4</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.atlinxi.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.4.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置文件

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-search

es配置类

package com.atlinxi.gulimall.search.config;

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

/**
 * es配置类,给容器中注入一个RestHighLevelClient
 */
@Configuration
public class GulimallElasticSearchConfig {

    // 后端访问es的时候,出于安全考虑,可以携带一个请求头
    // 现在暂时不用
    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.56.10", 9200, "http")
//                        new HttpHost("localhost", 9201, "http")
                ));
        return client;

    }


}

导包

package com.atlinxi.gulimall.search;

import com.alibaba.fastjson.JSON;
import com.atlinxi.gulimall.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.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
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.aggregations.metrics.Avg;
import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

@Autowired
RestHighLevelClient restHighLevelClient;

api

查询

// 1. 创建检索请求
SearchRequest searchRequest = new SearchRequest();

// 2. 指定索引
searchRequest.indices("bank");


// 3. 指定DSL,检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

// 3.1 构造检索条件
        // 所有的函数名都对应原生es DSL语句
//        searchSourceBuilder.query();
//        searchSourceBuilder.from();
//        searchSourceBuilder.size();
//        searchSourceBuilder.aggregation();
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.matchQuery("skuTitle", param.getKeyword()));
boolQuery.filter(QueryBuilders.termQuery("catalogId", param.getCatalog3Id()));
boolQuery.filter(QueryBuilders.termsQuery("brandId", param.getBrandId()));

BoolQueryBuilder nestedBoolQuery = QueryBuilders.boolQuery();
QueryBuilders.nestedQuery("attrs", nestedBoolQuery, ScoreMode.None);
boolQuery.filter(nestedQuery);

QueryBuilders.rangeQuery("skuPrice");
boolQuery.filter(rangeQuery);

searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
searchSourceBuilder.query(boolQuery);
searchSourceBuilder.sort(field, order);
sourceBuilder.from(0);
sourceBuilder.size(10);

HighlightBuilder builder = new HighlightBuilder();
builder.field("skuTitle");
builder.preTags("<b style='color:red'>");
builder.postTags("</b>");
sourceBuilder.highlighter(builder);

// 3.2 聚合
// 按照年龄的值分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
// 计算平均薪资
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
AggregationBuilders.nested("attr_agg", "attrs");
        
searchSourceBuilder.aggregation(balanceAvg);
searchSourceBuilder.aggregation(ageAgg);



// 4. 执行检索请求
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);


// 5.获取响应结果
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
searchHit.getSourceAsString();


// 3.1 获取聚合结果
Aggregations aggregations = searchResponse.getAggregations();
Terms ageAgg1 = aggregations.get("ageAgg");
// 返回值为List<? extends Terms.Bucket>
ageAgg1.getBuckets()
bucket.getKeyAsString();

aggregations.get("balanceAvg");

保存更新

// 添加数据有多种方式,例如hashmap、直接将json粘在这儿
IndexRequest request = new IndexRequest("users");
request.id("1");
//        request.source("userName","zhangsan","age",12,"gender","男");

//        String jsonString = "{" +
//                "\"user\":\"kimchy\"," +
//                "\"postDate\":\"2013-01-30\"," +
//                "\"message\":\"trying out Elasticsearch\"" +
//                "}";
//        request.source(jsonString, XContentType.JSON);

User user = new User();
user.setUserName("zs");
user.setAge(12);
user.setGender("man");
String jsonString = JSON.toJSONString(user);
request.source(jsonString, XContentType.JSON);

// 执行保存/更新操作
IndexResponse index = restHighLevelClient.index(request, GulimallElasticSearchConfig.COMMON_OPTIONS);





// 批量保存
// 1. 建立索引 product 建立好映射关系(kibana操作)
// 2. 给es中保存这些数据
BulkRequest bulkRequest = new BulkRequest();
IndexRequest indexRequest = new IndexRequest(EsConstant.Product_INDEX);
indexRequest.id(skuEsModel.getSkuId().toString());
String s = JSON.toJSONString(skuEsModel);
indexRequest.source(s, XContentType.JSON);
bulkRequest.add(indexRequest);
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);

// todo 如果批量错误,处理错误
boolean b = bulk.hasFailures();
bulk.getItems()

Spring Data ElasticSearch

Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:es="http://www.springframework.org/schema/data/elasticsearch"


       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd


       http://www.springframework.org/schema/data/elasticsearch
       http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd

">
    <!--
        如果你希望 进一步了解 xsd相关的知识 请求百度去 百度不着了  http://www.jk1123.com/?p=124
    -->

    <!--
        配置 client 连上 es

       配置 dao层的扫描

       配置其他  一个叫做 esTemplate  就是一个简单对应client封装


    -->


     <es:transport-client id="client" cluster-nodes="127.0.0.1:9300" cluster-name="my-elasticsearch"/>

    <es:repositories base-package="com.itheima.dao"></es:repositories>

    <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
        <constructor-arg name="client" ref="client"></constructor-arg>
    </bean>

</beans>

实体类

实体类的无参构造必须有,否则查询出来的对象无法映射到实体类

  • @Document(indexName=“blob3”,type=“article”):
    indexName:索引的名称(必填项)
    type:索引的类型

  • @Id:主键的唯一标识

  • @Field(index=true,analyzer=“ik_smart”,store=true,searchAnalyzer=“ik_smart”,type = FieldType.text)
    analyzer:存储时使用的分词器
    searchAnalyze:搜索时使用的分词器
    store:是否存储
    type: 数据类型

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

//@Document 文档对象 (索引信息、文档类型 )
@Document(indexName="test03",type="book")
public class Book {

    //@Id 文档主键 唯一标识
    @Id
    //@Field 每个文档的字段配置(类型、是否分词、是否存储、分词器 )
    @Field(store = true, index = false, type = FieldType.Integer)
    private Integer id;
    @Field(analyzer = "ik_max_word", store = true, type = FieldType.text)
    private String title;
    @Field(analyzer = "ik_max_word", store = true, type = FieldType.text)
    private String content;
    @Field(index = false, store = true, type = FieldType.Long)
    private Long sales;

dao

import com.itheima.domain.Book;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface BookDao extends ElasticsearchRepository<Book, Integer> {

// 除了系统自带的方法,还可以自定义命名
    List<Book> findByContent(String content);

    List<Book> findByContentAndTitle(String content, String title);

    Page<Book> findByContent(String content, Pageable pageable);

}

crud

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:beans.xml")
public class AppTest {

    @Resource
    private BookDao bookDao;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    // 创建索引库
    @Test
    public void testCreatIndex(){
        elasticsearchTemplate.createIndex(Book.class);
        elasticsearchTemplate.putMapping(Book.class);
    }


// 新增或者更新
    @Test
    public void save(){

        Book book = new Book(20,"20","20",20L);

        bookDao.save(book);
    }

    // 删除
    @Test
    public void testDelete(){
        bookDao.deleteById(20);
    }

    @Test
    public void testFindById(){

        Book book = bookDao.findById(20).get();
        System.out.println(book);
    }



@Test
    public void testFindByPageAndSort() throws IOException {

        // PageRequest.of()   构建的是一个Pageable对象,此对象是在spring-data-commons包下
        // 所以凡是spring data 系列,都可以用该对象来进行分页
        Page<Book> books = bookDao.findAll(PageRequest.of(0, 10,Sort.Direction.ASC,"sales"));

        // 总条数
        long totalElements = books.getTotalElements();
        // 总页数
        int totalPages = books.getTotalPages();
        System.out.println(totalElements);
        System.out.println(totalPages);

        books.forEach(book -> System.out.println(book));
    }

方法命名规则查询

在这里插入图片描述

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface BookDao extends ElasticsearchRepository<Book, Integer> {

    List<Book> findByContent(String content);

    List<Book> findByContentAndTitle(String content, String title);

    Page<Book> findByContent(String content, Pageable pageable);

}


@Test
    public void testMethodName(){

        List<Book> byContentAndTitle = bookDao.findByContentAndTitle("程序", "程序");

        byContentAndTitle.forEach(book -> System.out.println(book));
    }

springdata对es没有封装的方法

例如term、query_string、高亮显示等,就用原生api

@Test
    public void  findQueryString(){
        //没有封装 的方法
        SearchQuery searchQuery=new NativeSearchQueryBuilder()
                //依旧传递的查询方式  查询参数
                .withQuery(QueryBuilders.queryStringQuery("我是程序员"))
                .build();


        Page<Book> page = bookDao.search(searchQuery);
        long totalElements = page.getTotalElements();
        System.out.println("总条数:"+totalElements);
        int totalPages = page.getTotalPages();
        System.out.println("总页数:"+totalPages);
        List<Book> books = page.getContent();
        books.forEach(b-> System.out.println(b));

    }

    @Test
    public void  findTerm2(){
        //没有封装 的方法
        SearchQuery searchQuery=new NativeSearchQueryBuilder()
                //依旧传递的查询方式  查询参数
                .withQuery(QueryBuilders.termQuery("content","程序"))
                .build();


        Page<Book> page = bookDao.search(searchQuery);
        long totalElements = page.getTotalElements();
        System.out.println("总条数:"+totalElements);
        int totalPages = page.getTotalPages();
        System.out.println("总页数:"+totalPages);
        List<Book> books = page.getContent();
        books.forEach(b-> System.out.println(b));

    }

高亮显示

@Test
    public void testHighLight() {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                //依旧传递的查询方式  查询参数
                .withQuery(QueryBuilders.termQuery("content", "程序"))
                .withHighlightFields(new HighlightBuilder.Field("content").preTags("<xh style='color:red'>").postTags("</xh>"))
                .build();

        AggregatedPage<Book> page = elasticsearchTemplate.queryForPage(searchQuery, Book.class, new SearchResultMapper() {

            //自定义结果映射器 核心 将高亮字段取出 设置对象 返回数据就有高亮显示 而spring-data-es 默认实现
            //DefaultResultMapper 它 不会取出高亮字段  不用
            @Override
            public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
                List<Book> books = new ArrayList<>();
                // 总条数
                long totalHits = searchResponse.getHits().getTotalHits();
                //System.out.println(totalHits);
                // 数据,包含高亮显示的字段
                SearchHits hits = searchResponse.getHits();
                Iterator<SearchHit> iterator = hits.iterator();
                while (iterator.hasNext()) {
                    SearchHit sh = iterator.next();


                    // 每一条数据{id=17, title=程序员的自我修养—链接、装载与库, content=俯瞰程序前世今生参透代码如何变成程序在系统中运行 透过系统软件底层形成机制走进程序世界探索深层次的自己, sales=6856}
                    //高亮字段{content=[content], fragments[[俯瞰<xh style='color:red'>程序</xh>前世今生参透代码如何变成<xh style='color:red'>程序</xh>在系统中运行 透过系统软件底层形成机制走进<xh style='color:red'>程序</xh>世界探索深层次的自己]]}
                    Map<String, Object> source = sh.getSource();
                     System.out.println("每一条数据" + source);


                    Map<String, HighlightField> highlightFields = sh.getHighlightFields();
                     System.out.println("高亮字段" + highlightFields);

                    //开始封装book对象

                    Book book = new Book();
                    Integer id = (Integer) source.get("id");
                    book.setId(id);
                    String title = (String) source.get("title");
                    book.setTitle(title);
                    HighlightField content = highlightFields.get("content");
                    book.setContent(content.getFragments()[0].toString());
                    Integer sales = (Integer) source.get("sales");
                    book.setSales(Long.valueOf(sales));

                    books.add(book);
                }

                return new AggregatedPageImpl(books, pageable, totalHits);
            }
        });


        long totalElements = page.getTotalElements();
        System.out.println("总条数:" + totalElements);
        int totalPages = page.getTotalPages();
        System.out.println("总页数:" + totalPages);
        List<Book> books = page.getContent();
        books.forEach(b -> System.out.println(b));


    }

elasticsearch transport 通过9300操作

maven

<dependencies>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.9.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.24</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.1</version>
        </dependency>
</dependencies>

// 创建客户端对象
private TransportClient client;

    // 创建客户端对象
    @Before
    public void init() {
        try {
            //创建一个客户端对象
            Settings settings = Settings.builder()
                    .put("cluster.name", "my-elasticsearch")
                    .build();

            client = new PreBuiltTransportClient(settings)
                    //少服务器的地址
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9301))
//                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9302));

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }






// 创建type和mapping
client.admin().indices().preparePutMapping("test02")
                .setType("book")
                .setSource("{\n" +
                        "        \"book\": {\n" +
                        "            \"properties\": {\n" +
                        "                \"id\": {\n" +
                        "                \t\"type\": \"long\",\n" +
                        "                    \"store\": true,\n" +
                        "                    \"index\":\"not_analyzed\"\n" +
                        "                },\n" +
                        "                \"title\": {\n" +
                        "                \t\"type\": \"text\",\n" +
                        "                    \"store\": true,\n" +
                        "                    \"index\":\"analyzed\",\n" +
                        "                    \"analyzer\":\"ik_max_word\"\n" +
                        "                },\n" +
                        "                \"content\": {\n" +
                        "                \t\"type\": \"text\",\n" +
                        "                    \"store\": true,\n" +
                        "                    \"index\":\"analyzed\",\n" +
                        "                    \"analyzer\":\"ik_max_word\"\n" +
                        "                },\n" +
                        "                \"sales\":{\n" +
                        "                    \"type\": \"long\",\n" +
                        "                    \"store\": true,\n" +
                        "                    \"index\":\"not_analyzed\"\n" +
                        "                }\n" +
                        "            }\n" +
                        "        }\n" +
                        "    }", XContentType.JSON)
                .get();



// 文档的crud
@Test
    public void testAdd(){

        client.prepareIndex("test02", "book", "1")
                .setSource(
                        "{\n" +
                                "\t\"id\":1,\n" +
                                "\t\"title\":\"测试添加\",\n" +
                                "\t\"content\":\"测试添加数据\",\n" +
                                "\t\"sales\":666\n" +
                                "}",XContentType.JSON
                )
                .get();

    }


// 实体类进行存储
 @Test
    public void testAdd() throws JsonProcessingException {
        Book book = new Book();

        book.setId(2L);
        book.setTitle("对象测试");
        book.setContent("对象测试内容");
        book.setSales(1000L);

        // 使用json转换工具
        ObjectMapper mappers = new ObjectMapper();

        String string = mappers.writeValueAsString(book);


        client.prepareIndex("test02", "book", "2")
                .setSource(
                        string,XContentType.JSON
                )
                .get();
    }



@Test
public void deleteDocument(){
    
	client.prepareDelete("test02", "book", "1").get();
	
}





// 批量导入
    @Test
    public void bulkAdd() throws IOException {

        BulkRequestBuilder bulkRequest = client.prepareBulk();

        // 数据在本地中,进行读取
        File file = new File("F:\\darkHorse\\darkHorsePool\\springbootSeries\\dailyQuest\\day90_elasticSearch\\resource\\esData.txt");

        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));

        String line = null;
        int i = 1000;

        while ((line = bufferedReader.readLine()) != null){
            bulkRequest.add(client.prepareIndex("test02", "book",i++ + "")
                    .setSource(line,XContentType.JSON)
            );
        }


        BulkResponse bulkResponse = bulkRequest.get();
        if (bulkResponse.hasFailures()) {
            // process failures by iterating through each bulk response item
        }
    }








 @Test
    public void testFindIds(){
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch("test02")
                .setTypes("book")
                //这个地方 告诉构建器 使用什么类型查询方式
                //查询方式 使用 QueryBuilders.term...matchall....queryString
                .setQuery(QueryBuilders.idsQuery().addIds("1000","1002","1003"))
                .setFrom(0)
                .setSize(20);


        //返回了一个 SearchResponse 响应对象
        SearchResponse searchResponse = searchRequestBuilder.get();


        SearchHits hits = searchResponse.getHits();

        long totalHits = hits.getTotalHits();
        System.out.println("一共多少条记录:"+totalHits);

        Iterator<SearchHit> iterator = hits.iterator();

        while (iterator.hasNext()){
            SearchHit searchHit = iterator.next();

            Map<String, Object> source = searchHit.getSource();

            System.out.println(source);
        }
    }








SearchRequestBuilder searchRequestBuilder = client.prepareSearch("test02")
                .setTypes("book")
                //这个地方 告诉构建器 使用什么类型查询方式
                //查询方式 使用 QueryBuilders.term...matchall....queryString
                .setQuery(QueryBuilders.termQuery("content","程序"))
                .setFrom(0)
                .setSize(20);









@Test
    public void highLight() {

        HighlightBuilder highlightBuilder = new HighlightBuilder()
                .preTags("<font style='color:red'>")
                .postTags("</font>")
                .field("content");

        SearchRequestBuilder searchRequestBuilder = client.prepareSearch("test02")
                .setTypes("book")
                //这个地方 告诉构建器 使用什么类型查询方式
                //查询方式 使用 QueryBuilders.term...matchall....queryString
                .setQuery(QueryBuilders.termQuery("content", "程序"))
                .setFrom(0)
                .setSize(20)
                .highlighter(highlightBuilder);


        //返回了一个 SearchResponse 响应对象
        SearchResponse searchResponse = searchRequestBuilder.get();


        SearchHits hits = searchResponse.getHits();

        long totalHits = hits.getTotalHits();
        System.out.println("一共多少条记录:" + totalHits);

        Iterator<SearchHit> iterator = hits.iterator();

        while (iterator.hasNext()) {
            SearchHit searchHit = iterator.next();

            Map<String, Object> source = searchHit.getSource();

            System.out.println(source);

            //获取高亮显示的内容 这是一个map集合
            Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();

            HighlightField content = highlightFields.get("content");
            Text[] fragments = content.getFragments();
            System.out.println(fragments[0].toString());

        }

    }

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

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

相关文章

Windows命令大全

Windows命令大全命令简介运行流程CMD命令—文件管理CMD命令—磁盘管理CMD命令—系统管理CMD命令—进程管理CMD命令—控制台管理CMD命令—其他管理Windows运行工具操作示例命令简介 CMD命令是一种命令提示符&#xff0c;CMD是command的缩写&#xff0c;即命令提示符&#xff08…

QT(57)-QWT+VS2019+QT5.12.4环境配置-x86

1.下载QWT源码。 2.用VS2019-MSVC2019编译生成6个文件。 3.配置6个文件&#xff0c;把6个文件放对应的目录下。 4. 用自带的example检测配置环境。 1.下载QWT源码 Qwt Users Guide: Qwt - Qt Widgets for Technical Applications2.用VS2019-MSVC2019编译生成6个文件. #qw…

测试工程师如何提高自动化测试覆盖率

前言 自动化测试一直是测试人员的核心技能&#xff0c;也是测试的重要手段之一。尤其是在今年所谓的互联网寒冬的行情下&#xff0c;各大企业对测试人员的技术水平要求的很高&#xff0c;而测试人员的技术水平主要集中在三大自动化测试领域&#xff0c;再加测试辅助脚本的编写…

350-401-补充

补充 拖图 Cloud和On-Premise&#xff1b; Cloud&#xff1a; easy to scale the capacity up and down highly agile On-Premises&#xff1a; infrstructure requires large and regular investments highly customizable 云: 易于扩大和缩小容量 非常敏捷 本地: 基础设施…

nodejs基于vue 网上商城购物系统

可定制框架:ssm/Springboot/vue/python/PHP/小程序/安卓均可开发 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2. 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行…

15 个杀手级 你可能从未听说过的 JS 技术

我们都同意&#xff0c;在 Google 或 StackOverflow 上搜索 Javascript 错误修复或答案并不有趣&#x1f3f4;‍☠️。这里有 20 种简短而强大的 JavaScript 技术&#xff0c;它们可以最大限度地提高生产力 ⚡ 并最大限度地减少痛苦 &#x1fa78;。让我们深入研究代码&#x1…

人们最想看到的是:你在坚持什么?

【人们最想看到的是&#xff1a;你在坚持什么】 长远规划才能对抗不确定性 品牌也能够对抗不确定性 想想这么多年东搞搞&#xff0c;西搞搞 最后缺乏正向积累的【厚度】 趣讲大白话&#xff1a;把每滴水尽量接到碗里 人吃的是饭&#xff0c;拉出来的是信息 *********** 人们在频…

大数据周会-本周学习内容总结0102

目录 01、ElasticSearch-学习总结 02、SpringbootElasticSearch构建博客检索系统 01、将MySQL数据同步到ES中 02、SpringBoot集成ES 03、本周学习计划 第一次周会 大数据总监、搜狐四年-中国搜索 【mapReduce】sql 大数据代表&#xff1a;Hadoop、spark、es、flink zookee…

写给安徽合肥高三的你——少年不惧岁月长,敢挽桑弓射玉衡

文章目录说说我的看法英雄不论出处想帮帮你做科研&#xff0c;拼出个锦绣前程&#xff0c;朗朗乾坤&#xff01;我能做的可能很少&#xff0c;可是全世界都会为你让路说说我的看法 在今日头条看到你&#xff0c; 仿佛看到了年轻时候自己的影子&#xff0c;虽然自己现在在读研已…

PHP面向对象02:面向对象高级

PHP面向对象02&#xff1a;面向对象高级一、设计模式1. 单例模式2. 工厂模式二、面向对象三大特性1. 封装2. 继承3. 多态三、继承1. 实现继承2. 有限继承a. 属性都能继承b. 公有方法c. 受保护的方法d. 静态成员3. 重写4. PHP继承特点5. 静态延迟绑定6. 最终类和最终方法7. 抽象…

真空度精密控制技术在液相透射电子显微镜液体厚度调节中的应用

摘要&#xff1a;为了实现液相电子显微镜的更广泛和更便捷应用&#xff0c;需要对微芯片中的液体样本厚度进行精密调控。本文基于透射显微镜中被检液体样本内外压差对应于液体厚度这一凸起变形膨胀的基本现象&#xff0c;提出了通过精确控制液体池内部真空度来实现液体厚度精密…

【大数据离线开发】7.4 HBase数据保存和过滤器

7.4 数据保存的过程 注意&#xff1a;数据的存储&#xff0c;都需要注意Region的分裂 HDFS&#xff1a;数据的平衡 ——> 数据的移动&#xff08;拷贝&#xff09;HBase&#xff1a;数据越来越多 ——> Region的分裂 ——> 数据的移动&#xff08;拷贝&#xff09; …

美国原装KEYSIGHT E4981A(安捷伦) E4981A电容计

KEYSIGHT E4981A&#xff08;安捷伦&#xff09; Keysight E4981A&#xff08;安捷伦&#xff09;电容计为生产线中的陶瓷电容器测试提供了高速、可靠的测量。E4981A 实现了电容从小到大的测量能力&#xff0c;测量准确。Agilent E4981A 电容计有助于提高测试吞吐量&#xff0…

Structure|Alphafold2在肽结构预测任务上的基准实验

​题目&#xff1a;Benchmarking AlphaFold2 on peptide structureprediction 文献来源&#xff1a;2023, Structure 31, 1–9 代码&#xff1a;基准实验&#xff0c;比较了比较多的模型 1.背景介绍 由2-50个氨基酸构成的聚合物可以称为肽。但是关于肽和蛋白质之间的差异还是…

树莓派4b系统安装

文章目录一.树莓派系统和工具下载二.树莓派系统烧录一.树莓派系统和工具下载 树莓派系统下载&#xff1a;https://www.raspberrypi.com/software/operating-systems/ 下载系统镜像写入工具&#xff1a;Win32DiskImager https://sourceforge.net/projects/win32diskimager/ …

仅作笔记用:Windows 10 继续使用 IE 浏览器(针对23年2月14日的系统更新)

2 月 14 日更新后有部分 Windows 10 的用户反映 IE 浏览器无法使用&#xff0c;打开后变成 Edge 浏览器。由于有少数业内业务仍然必须使用 IE 浏览器&#xff0c;这里稍微研究了一下解决方法。 打开 IE 浏览器的时候会出现“IE已经合并进Edge浏览器”的提示&#xff0c;此时千…

华为手表开发:WATCH 3 Pro(10)获取心率

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;10&#xff09;获取心率初环境与设备文件夹&#xff1a;文件新增第二页面引用包 import sensor from system.sensor;showHeartbeat.hmlshowHeartbeat.js修改首页 -> 新建按钮 “ 跳转 ”index.hmlindex.js 引用包&#xff1…

JVM系统优化实践(1):JVM概览

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;这是多年之前做过的学习笔记&#xff0c;今天再翻出来&#xff0c;觉得仍然是记忆犹新。「独乐乐不如众乐乐」&#xff0c;就拿出来分享给「众乐乐」吧。目前大多…

BCN科研试剂:1263166-91-1,endo BCN-O-PNB,ENDO BCN - 活性酯(P-NPC)

试剂基团反应特点&#xff1a;endo BCN-O-PNB中在有机溶剂中很容易与含胺分子发生反应&#xff0c;PNB 是一个很好的离去基团&#xff0c;BCN 用于无铜点击化学反应。结构式&#xff08;Structural&#xff09;&#xff1a;基础产品数据&#xff1a;CAS号&#xff1a;1263166-9…

合并两个有序链表——递归解法

题目描述21. 合并两个有序链表难度简单2922收藏分享切换为英文接收动态反馈将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a;输入&#xff1a;l1 [1,2,4], l2 [1,3,4]输出&#xff1a;[1,1,2,3,4,4]示例…