java操作elasticsearch(二)

代码地址

https://gitee.com/wl1092212424/prarent-project.git

创建工程添加pom依赖

父工程pom文件

<!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
        <swagger2.version>2.9.2</swagger2.version>
    </properties>
    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>

            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${swagger2.version}</version>
                <optional>true</optional>
            </dependency>

            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${swagger2.version}</version>
                <optional>true</optional>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-annotation</artifactId>
                <version>3.1.0</version>
                <optional>true</optional>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.0.5</version>
                <optional>true</optional>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-core</artifactId>
                <version>3.1.0</version>
                <optional>true</optional>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-extension</artifactId>
                <version>3.1.0</version>
                <optional>true</optional>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>2.3.28</version>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.2.2.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

common模块pom文件

<properties>
        <swagger2.version>2.9.2</swagger2.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
    </dependencies>

es学习模块

<dependencies>
        <dependency>
            <groupId>com.lang.cloud</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-annotation</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-core</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
    </dependencies>

在yml中添加ES连接信息

server:
  port: 8081

spring:
  application:
    name: learning-es
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/national_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: Ab123456!@#
  data:
    elasticsearch:
      cluster-name: my-application
      cluster-nodes: 112.126.63.57:9300
      repositories:
        enabled: true

避免踩坑,添加一个bean

@SpringBootConfiguration
public class ElasticSearchConfig {
    @PostConstruct
    void init() {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
    }
}

创建ESRepository接口,用于与es交互

ElasticsearchTemplate这个不用我们注入就可以了,可以通过这个对象来操作ES

@Component
public interface NewsLogDocumentRepository extends ElasticsearchRepository<NewsLog,String> {
}

来实现增删改查

创建一个索引

    @Override
    public void addDocument(NewsLog... newsLog) {
        //先把这个mapping保存起来
        esTemplate.putMapping(NewsLog.class);
        //第二步存储数据
        //得到一共传递了多少个
        newsLogDocumentRepository.saveAll(Arrays.asList(newsLog));
    }

删除一个索引

    //删除索引
    @Override
    public void delete(String indexName) {
        boolean b = esTemplate.deleteIndex(indexName);
        System.out.println("删除的状态: " + b);
    }

清空索引

    @Override
    public void deleteAll() {
        newsLogDocumentRepository.deleteAll();
    }

根据ID获取

    @Override
    public NewsLog getNewsLogById(String id) {
        Optional<NewsLog> byId = newsLogDocumentRepository.findById(id);
        return byId.get();
    }

获取全部

    @Override
    public List<NewsLog> getAll() {
        List<NewsLog> list = new ArrayList<>();
        newsLogDocumentRepository.findAll().forEach(list::add);
        return list;
    }

搜索

    @Override
    public List<NewsLog> queryByKeyword(String keyword, Class<NewsLog> newsLogClass) {
        NativeSearchQuery build = new NativeSearchQueryBuilder().
                withQuery(new QueryStringQueryBuilder(keyword)).//根据关键词查询
                withSort(SortBuilders.scoreSort().//根据hit分查询
                        order(SortOrder.DESC)).build();//根据降序排列
        List<NewsLog> newsLogs = esTemplate.queryForList(build, newsLogClass);
        return newsLogs;
    }

搜索,命中关键字高亮

    @Override
    public List<Map<String, Object>> queryHit(String keyword, String indexName, String[] fieldNames) {
        //构造查询条件,使用标准的分词器
        QueryBuilder matchQuery = createQueryBuilder(keyword,fieldNames);

        //设置高亮默认的hightLighter高亮器
        HighlightBuilder highlightBuilder =  createHightlightBuilder(fieldNames);

        SearchResponse searchResponse = esTemplate.getClient().prepareSearch(indexName)
                .setQuery(matchQuery)
                .highlighter(highlightBuilder)
                .setSize(10000)// 设置一次返回的文档数量,最大值:10000
                .get();
        SearchHits hits = searchResponse.getHits();

        //返回高亮和不高亮的数据
        return getHitList(hits);
    }
    //构造查询条件,使用标准的分词器
    private QueryBuilder createQueryBuilder(String keyword, String[] fieldNames) {
        MultiMatchQueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, fieldNames)
                .analyzer("ik_max_word")
                .operator(Operator.OR);
        return queryBuilder;
    }
    //设置高亮默认的hightLighter高亮器
    private HighlightBuilder createHightlightBuilder(String[] fieldNames) {
        HighlightBuilder highlightBuilder = new HighlightBuilder()
                .preTags("<span> style='color:red'>")
                .postTags("</span>");
        for (String item : fieldNames) {
            highlightBuilder.field(item);
        }
        return highlightBuilder;
    }
private List<Map<String,Object>> getHitList(SearchHits hits){
        List<Map<String,Object>> list = new ArrayList<>();
        Map<String,Object> map;
        for (SearchHit item : hits) {
            map = new HashMap<>();
            //处理的源数据
            map.put("source",item.getSourceAsMap());
            //处理高亮数据
            Map<String, String> hitMap = new HashMap<>();
            Map<String, HighlightField> hightMap = item.getHighlightFields();
            hightMap.keySet().forEach((key)->{
                HighlightField value = hightMap.get(key);
                StringBuilder hightStr = new StringBuilder();
                Text[] fragments = value.getFragments();
                for (Text text : fragments) {
                    hightStr.append(text);
                }
                String name = value.getName();
                hitMap.put(name,hightStr.toString());
            });
            map.put("hightlight",hitMap);
            list.add(map);
        }
        return  list;
    }

分页查询

    @Override
    public Page<Map<String, Object>> queryHitByPage(int pageNo, int pageSize, String keyword, String indexName, String[] fieldNames) {
        //构造查询条件,使用标准分词器
        QueryBuilder queryBuilder = createQueryBuilder(keyword,fieldNames);
        //设置高亮,使用默认的hightLighter高亮器
        HighlightBuilder highlight = createHightlightBuilder(fieldNames);
        //设置查询字段
        SearchResponse response = esTemplate.getClient().prepareSearch(indexName)
                .setQuery(queryBuilder)
                .highlighter(highlight)
                .setFrom((pageNo-1) * pageSize)
                .setSize(pageNo * pageSize)// 设置一次返回的文档数量,最大值:10000
                .get();

        SearchHits hits = response.getHits();
        Long totalHits = hits.getTotalHits();
        Page<Map<String, Object>> page = new Page(pageNo,pageSize,totalHits.intValue());
        page.setList(getHitList(hits));
        return page;
    }

谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值