ElasticSearch初学笔记(二)

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

  • 说明
    • 开始编码

说明

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

开始编码

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

        
            org.springframework.boot
            spring-boot-starter-data-elasticsearch
        

实体类代码
@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: 缪坚杰 [email protected]
 * @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接口、包含基本的增删改查以及query查询。

package jianjie.elasticsearch.mapper;

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

/**
 * @Description:
 * @Author: 缪坚杰 [email protected]
 * @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: 缪坚杰 [email protected]
 * @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"),... ...);

执行结果:

ElasticSearch初学笔记(二)_第1张图片

ElasticSearch初学笔记(二)_第2张图片
全文搜索
ElasticSearch初学笔记(二)_第3张图片
搜索结果_score约大的数据越靠前,可以根据这个来分每个字段的权重从而来做出复杂的推荐。 __end

你可能感兴趣的:(ElasticSearch初学笔记(二))