ElasticSearch初学笔记(二)

SpringBoot整合ElasticSearch实现简单的全文搜索(个人版——代码实现)

说明

本篇文章将介绍SpringBoot整合ES如何实现全文搜索(较为简单)
ES相关工具安装以及数据同步是难点,教程请见上一篇

开始编码

启动一个SpringBoot项目,并再pom中加入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

实体类代码
@data为Lombok提供的自动get、set、toStirng的插件注解
@Document(indexName = “demo”, type = “user”) 标识这个实体类为ES的一个实体,indexName为索引名,type为类型。
@id 表示把该字段设置为ES中的id

package jianjie.elasticsearch.pojo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

/**
 * @Description:
 * @Author: 缪坚杰 jianjie.miao@luckincoffee.com
 * @Date: 2019/8/31
 */
@Data
@Document(indexName = "demo", type = "user")
public class UserEntity {
    @Id
    private String id;
    private String name;
    private Integer sex;
    private Integer age;
    private String introduction;
}

数据接口层,继承ElasticsearchRepository<UserEntity,String>接口、包含基本的增删改查以及query查询。

package jianjie.elasticsearch.mapper;

import jianjie.elasticsearch.pojo.UserEntity;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

/**
 * @Description:
 * @Author: 缪坚杰 jianjie.miao@luckincoffee.com
 * @Date: 2019/8/31
 */
public interface Repository extends ElasticsearchRepository<UserEntity,String> {
}

因为演示demo,所以直接上Controller层。
Controller代码

package jianjie.elasticsearch.controller;

import jianjie.elasticsearch.mapper.Repository;
import jianjie.elasticsearch.pojo.UserEntity;
import jianjie.elasticsearch.service.EsService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

/**
 * @Description:
 * @Author: 缪坚杰 jianjie.miao@luckincoffee.com
 * @Date: 2019/8/31
 */
@Slf4j
@RestController
public class EsController {
    @Autowired
    private Repository repository;

    @RequestMapping("/addUser")
    public UserEntity addUser(@RequestBody UserEntity userEntity) {
        return repository.save(userEntity);
    }

    @RequestMapping("/findById")
    public Optional<UserEntity> findById(String id) {
        return repository.findById(id);
    }

    @RequestMapping("/matchByName")
    public List<UserEntity> matchByName(String name) {
        return esService.matchByName(name);
    }

    private String searchs = "";

    @GetMapping("/search")
    public String search(@RequestParam("searchKey") String searchKey) {
        searchs = "";
        // 构建查询条件
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本分词查询(多字段匹配)
        queryBuilder.withQuery(QueryBuilders.multiMatchQuery(searchKey, "name", "introduction"));
		//  queryBuilder.withQuery(QueryBuilders.matchQuery("introduction", searchKey));
        // 搜索,获取结果
        Page<UserEntity> items = repository.search(queryBuilder.build());
        // 总条数
        long total = items.getTotalElements();
        searchs += "总共数据数:" + total + "\n";
        items.forEach(user -> {
            searchs += user.toString() + "\n";
        });
        log.info(searchs);
        return searchs;
    }
}

search方法的创建query为全文搜索重点

queryBuilder.withQuery(QueryBuilders.multiMatchQuery(查询字段(入参), "检索字段名1", "检索字段名2"),... ...);

执行结果:

在这里插入图片描述

在这里插入图片描述
全文搜索
在这里插入图片描述
搜索结果_score约大的数据越靠前,可以根据这个来分每个字段的权重从而来做出复杂的推荐。 __end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值