智能网站平台,wordpress同步头条,前端做学校网站教务,网络设计毕设1.引入pom依赖2.application 配置3.JavaBean配置以及ES相关注解 3.1 Student实体类3.2 Teacher实体类3.3 Headmaster 实体类4. 启动类配置5.elasticsearchRestTemplate 新增 5.1 createIndex putMapping 创建索引及映射 5.1.1 Controller层5.1.2 service层5.1.3 ser…1.引入pom依赖2.application 配置3.JavaBean配置以及ES相关注解 3.1 Student实体类3.2 Teacher实体类3.3 Headmaster 实体类4. 启动类配置5.elasticsearchRestTemplate 新增 5.1 createIndex putMapping 创建索引及映射 5.1.1 Controller层5.1.2 service层5.1.3 serviceimpl层createIndex putMapping 创建索引及映射测试结果5.2 save 添加文档 5.2.1 Controller层5.2.2 service层5.2.3 serviceimpl层save 添加文档测试结果6.elasticsearchRestTemplate 删除 6.1 deleteIndex 删除索引 6.1.1 Controller层6.1.2 service层6.1.3 serviceimpl层deleteIndex 删除索引测试结果6.2 delete 删除文档(通过主键删除) 6.2.1 Controller层6.2.2 service层6.2.3 serviceimpl层delete(通过主键删除) 删除文档测试结果6.3 delete 删除文档(删除通过query所搜索到的所有数据) 6.3.1 Controller层6.3.2 service层6.3.3 serviceimpl层delete(删除通过query所搜索到的所有数据) 删除文档测试结果7.elasticsearchRestTemplate 修改 7.1 update 修改文档(根据主键修改) 7.1.1 Controller层7.1.2 service层7.1.3 serviceimpl层update 修改文档(根据主键修改)测试结果8.elasticsearchRestTemplate 查询 8.1 get 查询文档(根据主键查询) 8.1.1 Controller层8.1.2 service层8.1.3 serviceimpl层get 查询文档(根据主键查询)测试结果8.2 exists 查询文档(判断主键id是否存在) 8.2.1 Controller层8.2.2 service层8.2.3 serviceimpl层exists 查询文档(判断主键id是否存在)测试结果8.3 queryForPage 查询文档(分页查询) 8.3.1 Controller层8.3.2 service层8.3.3 serviceimpl层queryForPage 查询文档(分页查询)测试结果8.4 AnalyzeRequest (根据入参内容返回分词后结果) 8.4.1 Controller层8.4.2 service层8.4.3 serviceimpl层AnalyzeRequest (根据入参内容返回分词后结果)测试结果8.5 termQuery 查询文档(入参不分词精确匹配) 8.5.1 Controller层8.5.2 service层8.5.3 serviceimpl层termQuery 查询文档(入参不分词精确匹配)测试结果8.6 match 查询文档(会对查询条件进行分词) 8.6.1 Controller层8.6.2 service层8.6.3 serviceimpl层match 查询文档(会对查询条件进行分词)测试结果8.7 matchAllQuery 查询文档(查询此索引下所有文档) 8.7.1 Controller层8.7.2 service层8.7.3 serviceimpl层matchAllQuery 查询文档(查询此索引下所有文档)测试结果8.8 wildcardQuery 查询文档(模糊查询) 8.8.1 Controller层8.8.2 service层8.8.3 serviceimpl层wildcardQuery 查询文档(模糊查询)测试结果8.9 prefixQuery 查询文档(前缀查询) 8.9.1 Controller层8.9.2 service层8.9.3 serviceimpl层prefixQuery 查询文档(前缀查询)测试结果8.10 regexpQuery 查询文档(正则表达式查询) 8.10.1 Controller层8.10.2 service层8.10.3 serviceimpl层regexpQuery 查询文档(正则表达式查询) 测试结果8.11 rangeQuery 查询文档(范围查询) 8.11.1 Controller层8.11.2 service层8.11.3 serviceimpl层rangeQuery 查询文档(范围查询) 测试结果8.12 Sort 查询文档 (排序) 8.12.1 Controller层8.12.2 service层8.12.3 serviceimpl层Sort 查询文档 (排序) 测试结果8.13 queryStringQuery 查询文档 (多条件查询 一值多域) 8.13.1 Controller层8.13.2 service层8.13.3 serviceimpl层queryStringQuery 查询文档 (多条件查询 一值多域) 测试结果8.14 boolQuery 查询文档 (对多个查询条件连接。连接方式must) 8.14.1 Controller层8.14.2 service层8.14.3 serviceimpl层boolQuery 查询文档 (对多个查询条件连接。连接方式must) 测试结果8.15 boolQuery 查询文档 (对多个查询条件连接。连接方式filter) 8.15.1 Controller层8.15.2 service层8.15.3 serviceimpl层boolQuery 查询文档 (对多个查询条件连接。连接方式filter) 测试结果8.16 boolQuery 查询文档 (对多个查询条件连接。连接方式must_not) 8.16.1 Controller层8.16.2 service层8.16.3 serviceimpl层boolQuery 查询文档 (对多个查询条件连接。连接方式must_not) 测试结果8.17 boolQuery 查询文档 (对多个查询条件连接。连接方式should) 8.17.1 Controller层8.17.2 service层8.17.3 serviceimpl层boolQuery 查询文档 (对多个查询条件连接。连接方式should) 测试结果8.18 HighlightBuilder 查询文档 (高亮) 8.18.1 Controller层8.18.2 service层8.18.3 serviceimpl层HighlightBuilder 查询文档 (高亮) 测试结果8.19 AggregationBuilders 查询文档 (聚合查询) 8.19.1 Controller层8.19.2 service层8.19.3 serviceimpl层AggregationBuilders 查询文档 (聚合查询) 测试结果8.20 SuggestBuilders查询文档 (completionSuggestion---搜索建议补全) 8.20.1 Controller层8.20.2 service层8.20.3 serviceimpl层SuggestBuilders查询文档 (completionSuggestion---搜索建议补全) 测试结果8.21 SuggestBuilders查询文档 (termSuggestion---纠错补全) 8.21.1 Controller层8.21.2 service层8.21.3 serviceimpl层SuggestBuilders查询文档 (termSuggestion---纠错补全) 测试结果~~8.22 SuggestBuilders查询文档 (phraseSuggestion---纠错补全)~~ ~~8.22.1 Controller层~~~~8.22.2 service层~~~~8.22.3 serviceimpl层~~~~SuggestBuilders查询文档 (termSuggestion---纠错补全) 测试结果~~链接[windows版本 Elasticsearch服务端-7.4.0以及kibana-7.4.0和ik分词器下载地址](https://mp.csdn.net/mp_download/manage/download/UpDetailed) 1.引入pom依赖 主要引用 elasticsearch使用相关依赖注意ES 服务端版本(7.4.0)要与客户端版本相容注意 hutool的工具类 实体转map 版本 !--引入springboot父工程依赖--!--引入依赖作用可以省去version标签来获得一些合理的默认配置--parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.3.2.RELEASE/version/parentdependencies!--elasticsearch使用相关依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-elasticsearch/artifactId/dependency!--引入提供Web开发场景依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--这里用到了类型转Map这里用到hutool的工具类(版本高一些低版本的 如果传的就是Map类型,在map转map时会报错)--dependencygroupIdcn.hutool/groupIdartifactIdhutool-core/artifactIdversion5.7.13/version/dependency!--用Data 减少JavaBean get...set...方法--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--两个用来做测试的jar包--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactId/dependency/dependencies 2.application 配置 spring:elasticsearch:rest:uris: 127.0.0.1:9200 #---ES的连接地址多个地址用逗号分隔username: #---用户名password: #---密码connection-timeout: 1000 #---连接超时时间(默认1s)read-timeout: 1000 #---读取超时时间(默认30s)3.JavaBean配置以及ES相关注解 注解Document用来声明Java对象与ElasticSearch索引的关系 indexName 索引名称(是字母的话必须是小写字母) type 索引类型 shards 主分区数量默认5 replicas 副本分区数量默认1 createIndex 索引不存在时是否自动创建索引默认true 不建议自动创建索引(自动创建的索引 是按着默认类型和默认分词器)注解Id 表示索引的主键注解Field 用来描述字段的ES数据类型是否分词等配置等于Mapping描述 index 设置字段是否索引默认是true如果是false则该字段不能被查询 store 默认为no,被store标记的fields被存储在和index不同的fragment中以便于快速检索。虽然store占用磁盘空间但是减少了计算。 type 数据类型(text、keyword、date、object、geo等) analyzer 对字段使用分词器注意一般如果要使用分词器字段的type一般是text。 format 定义日期时间格式详细见 官方文档: format | Elasticsearch Guide [8.9] | Elastic.注解CompletionField 定义关键词索引 要完成补全搜索 analyzer 对字段使用分词器注意一般如果要使用分词器字段的type一般是text。 searchAnalyzer 显示指定搜索时分词器默认是和索引是同一个保证分词的一致性。 maxInputLength:设置单个输入的长度默认为50 UTF-16 代码点 常用数据类型简单类型 字符串类型: - string(不再支持)可知string类型的field已经被移除了, 我们需要用text或keyword类型来代替string. text会分词不支持聚合 keyword不会分词将全部内容作为一个词条支持聚合 数字类型: 尽可能选择范围小的数据类型, 字段的长度越短, 索引和搜索的效率越高;(优先考虑使用带缩放因子的浮点类型) byte : 有符号的8位整数, 范围: [-128 ~ 127] short : 有符号的16位整数, 范围: [-32768 ~ 32767] integer : 有符号的32位整数, 范围: [−231 ~ 231-1] long : 有符号的64位整数, 范围: [−263 ~ 263-1] float : 32位单精度浮点数 double : 64位双精度浮点数 half_float : 16位半精度IEEE 754浮点类型 scaled_float : 缩放类型的的浮点数, 比如price字段只需精确到分, 57.34缩放因子为100, 存储结果为5734 日期类型:date JSON没有日期数据类型, 所以在ES中, 日期可以是: — 包含格式化日期的字符串 “2018-10-01”, 或2018/10/01 12:10:30 (可以通过 format属性 定义日期时间格式DateFormat 官方文法. — 代表时间毫秒数的长整型数字. — 代表时间秒数的整数. 布尔类型 boolean 可以接受表示真、假的字符串或数字: — 真值: true, “true”, “on”, “yes”, “1”… — 假值: false, “false”, “off”, “no”, “0”, “”(空字符串), 0.0, 0 复杂类型: 数组[] 由数组中第一个非空值决定数组类型(type FieldType.Keyword)List集合 由数组中第一个非空值决定数组类型(type FieldType.Keyword)嵌套类型: list里泛型是object形式的或自定义对象(type FieldType.Nested)对象{ }object for single JSON objects 单个JSON对象(type FieldType.Object) 3.1 Student实体类 import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;import java.util.Date;
import java.util.List;/** 学生* */
Data
AllArgsConstructor
NoArgsConstructor
//indexName名字如果是字母那么必须是小写字母
Document(indexName student, type _doc, replicas 1, shards 1, createIndex true)
public class Student {IdField(index true, store true, type FieldType.Keyword)private String sId;Field(index true, store true, type FieldType.Keyword)private String sName;Field(index true, store true, type FieldType.Text, analyzer ik_smart)//Text可以分词 ik_smart粗粒度分词 ik_max_word 为细粒度分词private String sAddress;Field(index false, store true, type FieldType.Integer)private Integer sAge;Field(index false, store true, type FieldType.Date, format DateFormat.basic_date_time)private Date sCreateTime;Field(index false, store true, type FieldType.Object)private Headmaster sHeadmaster;//班主任Field(index true, store false, type FieldType.Keyword)private String[] sCourseList; //数组类型 由数组中第一个非空值决定(这里数组和集合一个意思了)Field(index true, store false, type FieldType.Keyword)private ListString sColorList; //集合类型 由数组中第一个非空值决定Field(index true, store false, type FieldType.Nested)//嵌套类型list里泛型是object形式的或自定义对象private ListTeacher sTeacherList; //教所有科目的老师} 3.2 Teacher实体类 import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;
import org.springframework.data.elasticsearch.core.completion.Completion;import java.util.Date;/** 科目老师* */
Data
NoArgsConstructor
AllArgsConstructor
Document(indexName teacher, type _doc, replicas 1, shards 1, createIndex true)
public class Teacher {//主键idIdField(index true, store true, type FieldType.Keyword)//index:设置通过这个字段是否可以进行搜索private String tId;//姓名Field(index true, store true, type FieldType.Keyword)private String tName;//英文姓名Field(index true, store true, type FieldType.Keyword)private String tEnglishName;//班级Field(index true, store true, type FieldType.Keyword)private String tClassName;//地址Field(index true, store true, type FieldType.Text, analyzer ik_smart)private String tAddress;//至理名言Field(index true, store true, type FieldType.Keyword)private String tFamous;//年龄Field(index true, store true, type FieldType.Integer)private Integer tAge;//日期Field(index true, store true, type FieldType.Date, format DateFormat.basic_date_time)private Date tCreateTime;//定义关键词索引 要完成补全搜索必须要用到特殊的数据类型completion//要汉字拼音都能补全必须要使用自定义的ikpinyin分词器// maxInputLength:设置单个输入的长度默认为50 UTF-16 代码点CompletionField(analyzer ik_smart, searchAnalyzer ik_smart, maxInputLength 100)private Completion completion;public Teacher(String tId, String tName, String tEnglishName, String tClassName, String tAddress, Integer tAge, Date tCreateTime) {this.tId tId;this.tName tName;this.tEnglishName tEnglishName;this.tClassName tClassName;this.tAddress tAddress;this.tAge tAge;this.tCreateTime tCreateTime;}
} 3.3 Headmaster 实体类 import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.Date;
import java.util.List;/** 班主任* */
Data
NoArgsConstructor
AllArgsConstructor
Document(indexName headmaster, type _doc, replicas 1, shards 1, createIndex true)
public class Headmaster {Field(index true, store false, type FieldType.Keyword)private String hId;Field(index true, store false, type FieldType.Keyword)private String hName;Field(index true, store false, type FieldType.Keyword)private String hAddress;Field(index false, store false, type FieldType.Integer)private Integer hSalary;Field(index false, store false, type FieldType.Keyword)private ListString hClass;Field(index true, store true, type FieldType.Date, format DateFormat.basic_date_time)private Date hCreateTime;
} 4. 启动类配置 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/** 搜索引擎客户端启动类* */
SpringBootApplication
public class ElasticsearchApplication {public static void main(String[] args) {SpringApplication.run(ElasticsearchApplication.class, args);}
} 5.elasticsearchRestTemplate 新增 5.1 createIndex putMapping 创建索引及映射 createIndex 新增索引(数据库)putMapping 新增映射表结构一定要通过这种方法创建否则创建出来的映射都是默认的 createIndex putMapping 创建索引及映射测试 入参classType : 对象是要被ES注解所引用的的(基于Field和Documen注解属性 创建索引和映射) 5.1.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSaveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 新增类*/
RestController
RequestMapping(/elasticSearch/save)
public class ElasticsearchSaveController {Autowiredprivate ElasticsearchSaveService elasticsearchSaveService;/*** param classType : 要创建es的索引及映射(一定要通过这种方法创建否则都是创建出来的映射都是默认的)基于传入对象中的Document注解* return boolean* throws* Author Mhh* Date 2021/12/9 10:43*/PostMapping(createIndexAndMapping)public boolean createIndexAndMapping(Class? classType) {return elasticsearchSaveService.createIndexAndMapping(classType);}}5.1.2 service层 /*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 新增*/
public interface ElasticsearchSaveService {/*** param classType : 要创建es的索引及映射(一定要通过这种方法创建否则都是创建出来的映射都是默认的)基于传入对象中的Document注解* return boolean* throws* Author Mhh* Date 2021/12/9 10:43*/boolean createIndexAndMapping(Class? classType);
} 5.1.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSaveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.stereotype.Service;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 新增*/
Service
public class ElasticsearchSaveServiceImp implements ElasticsearchSaveService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param classType : 要创建es的索引及映射(一定要通过这种方法创建否则都是创建出来的映射都是默认的)基于传入对象中的Document注解* return boolean* throws* Author Mhh* Date 2021/12/9 10:43*/Overridepublic boolean createIndexAndMapping(Class? classType) {if (elasticsearchRestTemplate.indexExists(classType))return true;boolean index elasticsearchRestTemplate.createIndex(classType);boolean mapping elasticsearchRestTemplate.putMapping(classType);return index mapping;}
}createIndex putMapping 创建索引及映射测试结果 根据入参对象 ES注解 创建索引及映射 import com.it.mhh.elasticsearch.controller.ElasticsearchSaveController;
import com.it.mhh.elasticsearch.entity.Headmaster;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.completion.Completion;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 测试*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSaveControllerTest {Autowiredprivate ElasticsearchSaveController elasticsearchSaveController;/*** param classType : 要创建es的索引及映射(一定要通过这种方法创建否则都是创建出来的映射都是默认的)基于传入对象中的Document注解* return boolean* throws* Author Mhh* Date 2021/12/9 10:43*/Testpublic void createIndexAndMapping() {boolean indexAndMapping elasticsearchSaveController.createIndexAndMapping(Student.class);System.err.println(indexAndMapping);}} 5.2 save 添加文档 save(Iterable entities)可传集合 批量添加(同种类对象集合)save(T entity) 单个对象save(T… entities) : 可变参 save 添加文档测试 入参entities 有重载 可传集合 单个 或者 可变参 5.2.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSaveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 新增类*/
RestController
RequestMapping(/elasticSearch/save)
public class ElasticsearchSaveController {Autowiredprivate ElasticsearchSaveService elasticsearchSaveService;/*** param entities : 入参对象(必须是被Document注解注释的)【入参 可传单个 T集合IterableT可变参 T... 】* return T 反参对象* explain : 添加文档* Author Mhh* Date 2021/12/27 10:55*/PostMapping(saveList)public T IterableT save(RequestBody IterableT entities) {return elasticsearchSaveService.save(entities);}/*** param t : 入参对象(必须是被Document注解注释的)【入参 可传单个 T集合IterableT可变参 T... 】* return T 反参对象* explain : 添加文档* Author Mhh* Date 2021/12/27 10:55*/PostMapping(save)public T T save(RequestBody T t) {return elasticsearchSaveService.save(t);}}5.2.2 service层 /*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 新增*/
public interface ElasticsearchSaveService {/*** param entities : 入参对象(必须是被Document注解注释的)【入参 可传单个 T集合IterableT可变参 T... 】* return T 反参对象* explain : 添加文档* Author Mhh* Date 2021/12/27 10:55*/public T IterableT save(IterableT entities);/*** param t : 入参对象(必须是被Document注解注释的)【入参 可传单个 T集合IterableT可变参 T... 】* return T 反参对象* explain : 添加文档* Author Mhh* Date 2021/12/27 10:55*/public T T save(T t);
} 5.2.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSaveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.stereotype.Service;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 新增*/
Service
public class ElasticsearchSaveServiceImp implements ElasticsearchSaveService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param entities : 入参对象(必须是被Document注解注释的)【入参 可传单个 T集合IterableT可变参 T... 】* return T 反参对象* explain : 添加文档* Author Mhh* Date 2021/12/27 10:55*/Overridepublic T IterableT save(IterableT entities) {return elasticsearchRestTemplate.save(entities);}/*** param t : 入参对象(必须是被Document注解注释的)【入参 可传单个 T集合IterableT可变参 T... 】* return T 反参对象* explain : 添加文档* Author Mhh* Date 2021/12/27 10:55*/Overridepublic T T save(T t) {return elasticsearchRestTemplate.save(t);}}save 添加文档测试结果 根据被ES注解引用的入参对象存入相应索引中 import com.it.mhh.elasticsearch.controller.ElasticsearchSaveController;
import com.it.mhh.elasticsearch.entity.Headmaster;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.completion.Completion;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 测试*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSaveControllerTest {Autowiredprivate ElasticsearchSaveController elasticsearchSaveController;/*** param entities : 入参对象(必须是被Document注解注释的)【入参 可传单个 T集合IterableT可变参 T... 】* return T 反参对象* explain : 添加文档* Author Mhh* Date 2021/12/27 10:55*/Testpublic void savesStudentES() {Headmaster headmaster new Headmaster(1, 小白主任, 山东, 7500, Arrays.asList(一班, 二班), new Date());//班主任ListString colorList new ArrayList();//颜色colorList.add(red);colorList.add(white);colorList.add(black);ListTeacher teacherList new ArrayList();//所有科目老师teacherList.add(new Teacher(2, 小黑, black, 一班, 山东省济南市历下区, 13, new Date()));teacherList.add(new Teacher(2, 小蓝, blue, 二班, 山东省菏泽市单县, 14, new Date()));Student student new Student(1, mhh, 济南, 12, new Date(), headmaster, new String[]{语文, 数学, 英语}, colorList, teacherList);Student save elasticsearchSaveController.save(student);System.out.println(save);}/*** param entities : 入参对象(必须是被Document注解注释的)【入参 可传单个 T集合IterableT可变参 T... 】* return T 反参对象* explain : 添加文档* Author Mhh* Date 2021/12/27 10:55*/Testpublic void savesTeacherES() {Teacher teacher new Teacher(1, 小黑老师, black, 一班, 河北省保定市莲池区, 14, new Date());Teacher save elasticsearchSaveController.save(teacher);System.out.println(save);}/*** param entities : 入参对象(必须是被Document注解注释的)【入参 可传单个 T集合IterableT可变参 T... 】* return T 反参对象* explain : 添加文档* Author Mhh* Date 2021/12/27 10:55*/Testpublic void savesTeacherListES() {ListTeacher teacherList new ArrayList();teacherList.add(new Teacher(1, 小黑老师, black, 一班, 山东省泰安市岱岳区,且随疾风前行,身后亦须留心, 15, new Date(), new Completion(new String[]{山东省泰安市岱岳区})));teacherList.add(new Teacher(2, 小白老师, white, 二班, 山东省济南市历下区, 此剑之势,愈斩愈烈,17, new Date(), new Completion(new String[]{山东省济南市历下区})));teacherList.add(new Teacher(3, 小黄老师, yellow, 二班, 河北省保定市莲池区, 荣耀存于心,而非流于形,18, new Date(), new Completion(new String[]{河北省保定市莲池区})));teacherList.add(new Teacher(5, 小蓝教授, blue, 二班, 山东省济南市高新区, 吾之初心,永世不忘,21, new Date(), new Completion(new String[]{山东省济南市高新区})));teacherList.add(new Teacher(4, 小绿教授, green, 一班, 山西省太原市杏花岭区, 有些失误无法犯两次,24, new Date(), new Completion(new String[]{山西省太原市杏花岭区})));IterableTeacher save elasticsearchSaveController.save(teacherList);System.out.println(save);}} 6.elasticsearchRestTemplate 删除 6.1 deleteIndex 删除索引 deleteIndex 删除索引(数据库) deleteIndex 删除索引测试 入参classType : 删除的哪个索引(从传入对象中的Document注解中indexName属性获取) 6.1.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchDeleteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 删除类*/
RestController
RequestMapping(/elasticSearch/delete)
public class ElasticsearchDeleteController {Autowiredprivate ElasticsearchDeleteService elasticsearchDeleteService;/*** param clazz : 删除的哪个索引(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* explain : 删除索引* Author Mhh* Date 2021/12/27 14:27*/PostMapping(deleteIndex)public Boolean deleteIndex(Class? clazz) {return elasticsearchDeleteService.deleteIndex(clazz);}
}6.1.2 service层 import org.springframework.data.elasticsearch.core.query.Query;
/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchDeleteService {/*** param clazz : 删除的哪个索引(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* explain : 删除索引* Author Mhh* Date 2021/12/27 14:27*/public Boolean deleteIndex(Class? clazz);
} 6.1.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchDeleteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.stereotype.Service;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchDeleteServiceImp implements ElasticsearchDeleteService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param clazz : 删除的哪个索引(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* explain : 删除索引* Author Mhh* Date 2021/12/27 14:27*/public Boolean deleteIndex(Class? clazz) {return elasticsearchRestTemplate.deleteIndex(clazz);}} deleteIndex 删除索引测试结果 根据入参对象 ESDocument注解中indexName属性值删除索引如果删除的 索引名不存在 返回false import com.it.mhh.elasticsearch.controller.ElasticsearchDeleteController;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermsQueryBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.test.context.junit4.SpringRunner;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchDeleteControllerTest {Autowiredprivate ElasticsearchDeleteController elasticsearchDeleteController;/*** param clazz : 删除的哪个索引(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* explain : 删除索引* Author Mhh* Date 2021/12/27 14:27*/Testpublic void deleteIndex() {Boolean aBoolean elasticsearchDeleteController.deleteIndex(Teacher.class);System.err.println(aBoolean);}
} 6.2 delete 删除文档(通过主键删除) delete(Object entity):通过入参对象主键删除delete(String id, Class? entityType) id表示要删除的主键entityType表示 被Document注解且有indexName属性值(indexName属性值为索引名) delete(通过主键删除) 删除文档测试 两种入参形式 都是通过主键id删除,即使入参对象其它属性设置了值也是通过主键id删除 6.2.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchDeleteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 删除类*/
RestController
RequestMapping(/elasticSearch/delete)
public class ElasticsearchDeleteController {Autowiredprivate ElasticsearchDeleteService elasticsearchDeleteService;/*** param id : 要删除的主键id* param entityType : 删除的哪个索引的数据(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* throws* Author Mhh* Date 2021/12/9 10:40*/PostMapping(deleteById)public Boolean delete(RequestParam(id) String id, Class? entityType) {return elasticsearchDeleteService.delete(id, entityType);}/*** param entity : 这个实体对象必须是被Document注解且有indexName属性值) 以及主键必须有值,其它参数有无都没关系(和用主键id删除没区别)* return java.lang.Boolean* throws* Author Mhh* Date 2021/12/9 10:40*/PostMapping(delete)public Boolean delete(Object entity) {return elasticsearchDeleteService.delete(entity);}}6.2.2 service层 import org.springframework.data.elasticsearch.core.query.Query;
/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchDeleteService {/*** param id : 要删除的主键id* param entityType : 删除的哪个索引的数据(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* throws* Author Mhh* Date 2021/12/9 10:40*/Boolean delete(String id, Class? entityType);/*** param entity : 这个实体对象必须是被Document注解且有indexName属性值) 以及主键必须有值,其它参数有无都没关系(和用主键id删除没区别)* return java.lang.Boolean* throws* Author Mhh* Date 2021/12/9 10:40*/public Boolean delete(Object entity);
} 6.2.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchDeleteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.stereotype.Service;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchDeleteServiceImp implements ElasticsearchDeleteService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param id : 要删除的主键id* param entityType : 删除的哪个索引的数据(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* throws* Author Mhh* Date 2021/12/9 10:40*/Overridepublic Boolean delete(String id, Class? entityType) {String delete elasticsearchRestTemplate.delete(id, entityType);return true;}/*** param entity : 这个实体对象必须是被Document注解且有indexName属性值) 以及主键必须有值,其它参数有无都没关系(和用主键id删除没区别)* return java.lang.Boolean* throws* Author Mhh* Date 2021/12/9 10:40*/Overridepublic Boolean delete(Object entity) {String delete elasticsearchRestTemplate.delete(entity);return true;}
} delete(通过主键删除) 删除文档测试结果 根据入参对象 ESDocument注解中indexName属性值查询删除哪哥索引中文档如果删除的指定索引名中的文档 索引名不存在 报错即使删除的文档不存在 ES依旧返回删除的主键 import com.it.mhh.elasticsearch.controller.ElasticsearchDeleteController;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermsQueryBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.test.context.junit4.SpringRunner;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchDeleteControllerTest {Autowiredprivate ElasticsearchDeleteController elasticsearchDeleteController;/*** param entity : 这个实体对象必须是被Document注解且有indexName属性值) 以及主键必须有值,其它参数有无都没关系(和用主键id删除没区别)* return java.lang.Boolean* throws* Author Mhh* Date 2021/12/9 10:40*/Testpublic void deleteByIdES() {Teacher teacher new Teacher();teacher.setTId(3);teacher.setTName(mhh);//没有用处,根据主键删除Boolean delete elasticsearchDeleteController.delete(teacher);//Boolean aBoolean elasticsearchDeleteController.delete(3, Teacher.class);System.err.println(aBoolean);//true}
} 6.3 delete 删除文档(删除通过query所搜索到的所有数据) delete(Query query, Class? clazz, IndexCoordinates index) query:查询语法 包含(term查询、terms查询、match查询、范围查询、模糊查询…) clazz: 来指定查询字段和结果后返回的实例对象 indx: 指定索引 delete(删除通过query所搜索到的所有数据) 删除文档测试 删除掉被query所搜索到的所有数据。 6.3.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchDeleteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 删除类*/
RestController
RequestMapping(/elasticSearch/delete)
public class ElasticsearchDeleteController {Autowiredprivate ElasticsearchDeleteService elasticsearchDeleteService;/*** param query : 删除掉被query所搜索到的所有数据。* param entity : 删除的哪个索引的数据(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* explain :* Author Mhh* Date 2021/12/27 14:22*/PostMapping(deleteByQuery)public Boolean delete(Query query, Class? entity) {return elasticsearchDeleteService.delete(query, entity);}}6.3.2 service层 import org.springframework.data.elasticsearch.core.query.Query;
/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchDeleteService {/*** param query : 删除掉被query所搜索到的所有数据。* param entity : 删除的哪个索引的数据(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* explain :* Author Mhh* Date 2021/12/27 14:22*/public Boolean delete(Query query, Class? entity);} 6.3.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchDeleteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.stereotype.Service;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchDeleteServiceImp implements ElasticsearchDeleteService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param query : 删除掉被query所搜索到的所有数据。* param entity : 删除的哪个索引的数据(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* explain :* Author Mhh* Date 2021/12/27 14:22*/public Boolean delete(Query query, Class? entity) {elasticsearchRestTemplate.delete(query, entity, elasticsearchRestTemplate.getIndexCoordinatesFor(entity));return true;}} delete(删除通过query所搜索到的所有数据) 删除文档测试结果 通过match词条分词 取并集查询后 结果被删除ik_smart: 粗粒度分词 山东省济南市 被分为(“山东省”,“济南市”)只要tAddress字段里包含 山东省和济南市 就会被查询到 然后被删除 import com.it.mhh.elasticsearch.controller.ElasticsearchDeleteController;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermsQueryBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.test.context.junit4.SpringRunner;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchDeleteControllerTest {Autowiredprivate ElasticsearchDeleteController elasticsearchDeleteController;/*** param query : 删除掉被query所搜索到的所有数据。* param entity : 删除的哪个索引的数据(从传入对象中的Document注解中indexName属性获取)* return java.lang.Boolean* explain :* Author Mhh* Date 2021/12/27 14:22*/Testpublic void deleteByQuery() {//查询条件(词条查询对应ES query里的match)MatchQueryBuilder matchQueryBuilder QueryBuilders.matchQuery(tAddress, 山东省济南市).operator(Operator.AND).analyzer(ik_smart);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(matchQueryBuilder);Boolean aBoolean elasticsearchDeleteController.delete(nativeSearchQuery, Teacher.class);System.err.println(aBoolean);}
} 7.elasticsearchRestTemplate 修改 7.1 update 修改文档(根据主键修改) update(UpdateQuery query, IndexCoordinates index) query:要修改参数的主键及修改值 index:指定索引bulkUpdate(ListUpdateQueryqueries, IndexCoordinates index):批量修改 update 修改文档(根据主键修改)测试 id: 表示要修改哪个文档(_id)object要修改的值对象(这里的对象最终都会转成Map)注意 这里属性值如果是空或null的话 那么也会被更新 用的 hutool-core转map(版本高一些低版本的 如果传的就是Map类型,在map转map时会报错 – 5.7.13)classType : 修改的哪个索引实体 (主要是获取对象里面Document注解indexName属性获取修改哪个索引里的数据 7.1.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchUpdateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 修改类*/
RestController
RequestMapping(/elasticSearch/update)
public class ElasticsearchUpdateController {Autowiredprivate ElasticsearchUpdateService elasticsearchUpdateService;/*** param id : 主键id(es里的_id)* param object : 要修改的数据(这里的值都会转成Map)注意 这里入参如果是空或null的话 那么也会被更新* // 用的 hutool-core转map(版本高一些低版本的 如果传的就是Map类型,在map转map时会报错 -- 5.7.13)* param classType : 修改的哪个索引实体 (主要是获取对象里面Document注解indexName属性获取修改哪个索引里的数据* return java.lang.Boolean* explain : 根据主键修改数据* Author Mhh* Date 2021/12/27 11:16*/PostMapping(update)public Boolean update(RequestParam(id) String id, RequestBody Object object, Class? classType) {return elasticsearchUpdateService.update(id, object, classType);}
} 7.1.2 service层 /*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 修改*/
public interface ElasticsearchUpdateService {/*** param id : 主键id(es里的_id)* param object : 要修改的数据(这里的值都会转成Map)注意 这里入参属性值如果是空或null的话 那么也会被更新* // 用的 hutool-core转map(版本高一些低版本的 如果传的就是Map类型,在map转map时会报错 -- 5.7.13)* param classType : 修改的哪个索引实体 (主要是获取对象里面Document注解indexName属性获取修改哪个索引里的数据* return java.lang.Boolean* explain : 根据主键修改数据* Author Mhh* Date 2021/12/27 11:16*/Boolean update(String id, Object object, Class? classType);
} 7.1.3 serviceimpl层 import cn.hutool.core.bean.BeanUtil;
import com.it.mhh.elasticsearch.service.ElasticsearchUpdateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.UpdateQuery;
import org.springframework.data.elasticsearch.core.query.UpdateResponse;
import org.springframework.stereotype.Service;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 修改*/
Service
public class ElasticsearchUpdateServiceImp implements ElasticsearchUpdateService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param id : 主键id(es里的_id)* param object : 要修改的数据(这里的值都会转成Map)注意 这里入参如果是空或null的话 那么也会被更新* // 用的 hutool-core转map(版本高一些低版本的 如果传的就是Map类型,在map转map时会报错 -- 5.7.13)* param classType : 修改的哪个索引实体 (主要是获取对象里面Document注解indexName属性获取修改哪个索引里的数据* return java.lang.Boolean* explain : 根据主键修改数据* Author Mhh* Date 2021/12/27 11:16*/Overridepublic Boolean update(String id, Object object, Class? classType) {UpdateQuery.Builder builder UpdateQuery.builder(id).withDocument(org.springframework.data.elasticsearch.core.document.Document.from(BeanUtil.beanToMap(object)));IndexCoordinates of IndexCoordinates.of(classType.getAnnotation(Document.class).indexName());UpdateResponse update elasticsearchRestTemplate.update(builder.build(), of);return true;}} update 修改文档(根据主键修改)测试结果 据主键id修改(这里如果修改时没找到主键id就会报错)这里可以复用es的插入(存入时es里已经有此主键就是修改没有就是新增)注意属性值是否为null值 es不会分辨 只会更新(即使是null值也会更新) import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.controller.ElasticsearchUpdateController;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchUpdateControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;Autowiredprivate ElasticsearchUpdateController elasticsearchUpdateController;/** 根据主键id修改(这里如果修改时没找到主键id就会报错)[这里可以复用es的插入(存入时es里已经有此主键就是修改没有就是删除)]* */Testpublic void updateByIdES() {Teacher teacher elasticsearchSelectController.get(2, Teacher.class);//Teacher(tId2, tName小白老师, tEnglishNamewhite, tClassName二班, tAddress山东省济南市历下区, tFamous此剑之势,愈斩愈烈, tAge17, tCreateTimeWed Dec 29 14:20:50 CST 2021, completionorg.springframework.data.elasticsearch.core.completion.Completion6cd2cb2)System.err.println(teacher);MapString, Object map new HashMap();map.put(tName, mhh);map.put(tAge, 11);map.put(tAddress,null);Boolean aBoolean elasticsearchUpdateController.update(2, map, Teacher.class);//这里建议用map形式的(主要是它不能像sql智能,校验null:如果传了字段是null那么就会修改成为null)System.err.println(aBoolean);//trueteacher elasticsearchSelectController.get(2, Teacher.class);//Teacher(tId2, tNamemhh, tEnglishNamewhite, tClassName二班, tAddressnull, tFamous此剑之势,愈斩愈烈, tAge11, tCreateTimeWed Dec 29 14:20:50 CST 2021, completionorg.springframework.data.elasticsearch.core.completion.Completion1d1cfe4)System.err.println(teacher);}} 8.elasticsearchRestTemplate 查询 8.1 get 查询文档(根据主键查询) get(String id, Class? clazz) id:文档主键 clazz:类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引]) get 查询文档(根据主键查询)测试 根据主键id查询数据 8.1.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param id : 主键id* param classType : 类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引])* return T* explain : 根据主键id查询数据* Author Mhh* Date 2021/12/10 10:46*/PostMapping(get)public T T get(String id, ClassT classType) {return elasticsearchSelectService.get(id, classType);}
}8.1.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param id : 主键id* param classType : 类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引])* return T* explain : 根据主键id查询数据* Author Mhh* Date 2021/12/10 10:46*/public T T get(String id, ClassT classType);} 8.1.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param id : 主键id* param classType : 类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引])* return T* explain : 根据主键id查询数据* Author Mhh* Date 2021/12/10 10:46*/Overridepublic T T get(String id, ClassT classType) {T t elasticsearchRestTemplate.get(id, classType);return t;}} get 查询文档(根据主键查询)测试结果 根据主键id查询结果获取不到就是null
import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询Testpublic void selectByIdES() {Teacher teacher elasticsearchSelectController.get(2, Teacher.class);System.err.println(teacher);//Teacher(tId2, tName小白老师, tAge17, tCreateTimeSat Dec 04 10:43:34 CST 2021)Student student elasticsearchSelectController.get(1, Student.class);System.err.println(student);/*Student(sId1, sNamemhh, sAddress济南, sAge12, sCreateTimeSat Dec 04 10:34:14 CST 2021,sHeadmasterHeadmaster(hId1, hName小白主任, hAddress山东, hSalary7500, hClass[一班, 二班], hCreateTimeSat Dec 04 10:34:14 CST 2021),sCourseList[语文, 数学, 英语],sColorList[red, white, black],sTeacherList[Teacher(tId2, tName小黑, tAge13, tCreateTimeSat Dec 04 10:34:14 CST 2021), Teacher(tId2, tName小蓝, tAge14, tCreateTimeSat Dec 04 10:34:14 CST 2021)])*/Student nullStudent elasticsearchSelectController.get(11, Student.class);//测试没有此主键的查询System.err.println(nullStudent); // null}} 8.2 exists 查询文档(判断主键id是否存在) exists(String id, Class? clazz) id:文档主键 clazz:类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引])exists(String id, IndexCoordinates index) id:文档主键 index:指定索引 exists 查询文档(判断主键id是否存在)测试 根据主键id查询索引中是否存在此文档 8.2.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param id : 主键id* param classType : 类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引])* return java.lang.Boolean* explain : 判断主键id是否存在* Author Mhh* Date 2021/12/29 14:54*/PostMapping(exists)public Boolean exists(String id, Class? classType) {return elasticsearchSelectService.exists(id, classType);}}8.2.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param id : 主键id* param classType : 类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引])* return java.lang.Boolean* explain : 判断主键id是否存在* Author Mhh* Date 2021/12/29 14:54*/public Boolean exists(String id, Class? classType);} 8.2.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param id : 主键id* param classType : 类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引])* return java.lang.Boolean* explain : 判断主键id是否存在* Author Mhh* Date 2021/12/29 14:54*/Overridepublic Boolean exists(String id, Class? classType) {return elasticsearchRestTemplate.exists(id, classType);}} exists 查询文档(判断主键id是否存在)测试结果 根据主键id判断此索引中是否有此文档(有返回true,没有返回false) import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param id : 主键id* param classType : 类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引])* return java.lang.Boolean* explain : 判断主键id是否存在* Author Mhh* Date 2021/12/29 14:54*/Testpublic void exists() {Boolean exists elasticsearchSelectController.exists(11, Teacher.class);System.err.println(exists);//false}} 8.3 queryForPage 查询文档(分页查询) queryForPage(Query query, Class? clazz, IndexCoordinates index) query:查询语法 包含(term查询、terms查询、match查询、范围查询、模糊查询…) clazz:类对象(用来获取这个对象中的Document注解中indexName属性[表示查询那个索引]) index:指定索引 queryForPage 查询文档(分页查询)测试 NativeSearchQueryBuilder withPageable(Pageable pageable)构建Pageable 对象 进行分页添加分页信息 不设置 默认10条(用查询条件构建器) 8.3.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param pageNum : 分页查询的页数* param pageSize : 分页查询返回的每页个数* param key : 查询es的字段名* param value : 要查询字段名中的值* param classType : 返回的类类型* return ListT/T* throws* Author Mhh* Date 2021/12/9 10:36*/PostMapping(selectFindPage)public T ListT selectFindPage(Integer pageNum, Integer pageSize, String key, String value, ClassT classType) {return elasticsearchSelectService.selectFindPage(pageNum, pageSize, key, value, classType);}}8.3.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param pageNum : 分页查询的页数* param pageSize : 分页查询返回的每页个数* param key : 查询es的字段名* param value : 要查询字段名中的值* param classType : 返回的类类型* return ListT/T* throws* Author Mhh* Date 2021/12/9 10:36*/public T ListT selectFindPage(Integer pageNum, Integer pageSize, String key, String value, ClassT classType);} 8.3.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param pageNum : 分页查询的页数* param pageSize : 分页查询返回的每页个数* param key : 查询es的字段名* param value : 要查询字段名中的值* param classType : 返回的类类型* return ListT/T* throws* Author Mhh* Date 2021/12/9 10:36*/public T ListT selectFindPage(Integer pageNum, Integer pageSize, String key, String value, ClassT classType) {NativeSearchQueryBuilder nativeSearchQueryBuilder new NativeSearchQueryBuilder();MatchQueryBuilder matchQueryBuilder QueryBuilders.matchQuery(key, value).analyzer(ik_smart);//分词查询(这里指定分词只是分传过来的参数)[它是要和es索引里的分词后数据一一对应才能返回]/*例子前台传了 (山东省:粗粒度分为山东省 细粒度分为山东省,山东,省)es索引库里(山东省济南市 粗粒度分为 山东省,济南市 细粒度分为:山东省,山东,省,济南市,济南,市)只有当前台分的词和后台分的词能有一个匹配上就可以*/nativeSearchQueryBuilder.withQuery(matchQueryBuilder);nativeSearchQueryBuilder.withPageable(PageRequest.of(pageNum null || pageNum 0 ? 0 : pageNum - 1, pageSize));//4.构建查询对象NativeSearchQuery query nativeSearchQueryBuilder.build();IndexCoordinates of IndexCoordinates.of(classType.getAnnotation(Document.class).indexName());AggregatedPageT page elasticsearchRestTemplate.queryForPage(query, classType, of);long totalElements page.getTotalElements(); // 总记录数int totalPages page.getTotalPages(); // 总页数int pageNumber page.getPageable().getPageNumber(); // 当前页号ListT beanList page.toList(); // 当前页数据集SetT beanSet page.toSet(); // 当前页数据集return page.getContent();}} queryForPage 查询文档(分页查询)测试结果 match分词查询 默认并集 ES索引中可看出符合的有两条最终通过分页返回一条 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param pageNum : 分页查询的页数* param pageSize : 分页查询返回的每页个数* param key : 查询es的字段名* param value : 要查询字段名中的值* param classType : 返回的类类型* return ListT/T* throws* Author Mhh* Date 2021/12/9 10:36*/Testpublic void selectFindPage() {ListTeacher teacherList elasticsearchSelectController.selectFindPage(1, 1, tAddress, 山东省, Teacher.class);System.out.println(teacherList.size());// 1}} 8.4 AnalyzeRequest (根据入参内容返回分词后结果) tokenizer: 选择粗细粒度分词器text: 需要分词的内容 AnalyzeRequest (根据入参内容返回分词后结果)测试 粗粒度分词器:ik_smart 粗粒度分词—北京天安门[北京,天安门]细粒度分词器:ik_max_word 细粒度分词—北京天安门[北京,天安门,天安,门] 8.4.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param tokenizer : 粗细粒度分词(粗粒度:ik_smart 细粒度:ik_max_word)* param text : 需要分词的入参* return java.util.Listorg.elasticsearch.client.indices.AnalyzeResponse.AnalyzeToken* throws* explain* Author Mhh* Date 2021/12/9 16:16*/PostMapping(selectBreakUpText)public ListAnalyzeResponse.AnalyzeToken selectBreakUpText(String tokenizer, String text) throws NoSuchFieldException, IllegalAccessException, IOException {return elasticsearchSelectService.selectBreakUpText(tokenizer, text);}}8.4.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param tokenizer : 粗细粒度分词(粗粒度:ik_smart 细粒度:ik_max_word)* param text : 需要分词的入参* return java.util.Listorg.elasticsearch.client.indices.AnalyzeResponse.AnalyzeToken* throws* explain* Author Mhh* Date 2021/12/9 16:16*/public ListAnalyzeResponse.AnalyzeToken selectBreakUpText(String tokenizer, String text) throws NoSuchFieldException, IllegalAccessException, IOException;} 8.4.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param tokenizer : 粗细粒度分词(粗粒度:ik_smart 细粒度:ik_max_word)* param text : 需要分词的入参* return java.util.Listorg.elasticsearch.client.indices.AnalyzeResponse.AnalyzeToken* throws* explain* Author Mhh* Date 2021/12/9 16:16*/public ListAnalyzeResponse.AnalyzeToken selectBreakUpText(String tokenizer, String text) throws IOException {RestHighLevelClient restHighLevelClient elasticsearchRestTemplate.execute((client) - client);AnalyzeRequest request AnalyzeRequest.buildCustomAnalyzer(tokenizer).build(text);AnalyzeResponse response restHighLevelClient.indices().analyze(request, RequestOptions.DEFAULT);return response.getTokens();
//-------------------------------这两种都可以---------------------------------------------------------------------
// AnalyzeRequest request AnalyzeRequest.buildCustomAnalyzer(tokenizer).build(text);
// Class? extends ElasticsearchRestTemplate aClass elasticsearchRestTemplate.getClass();//反射
// Field client aClass.getDeclaredField(client);//获得 ElasticsearchRestTemplate里的client属性
// client.setAccessible(true);//私有权限解除
// RestHighLevelClient restHighLevelClient (RestHighLevelClient) client.get(elasticsearchRestTemplate);
// AnalyzeResponse response restHighLevelClient.indices().analyze(request, RequestOptions.DEFAULT);
// return response.getTokens();}} AnalyzeRequest (根据入参内容返回分词后结果)测试结果 通过查询分词后结果来校验 分词后查询文档返回的解果是否正确 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param tokenizer : 粗细粒度分词(粗粒度:ik_smart 细粒度:ik_max_word)* param text : 需要分词的入参* return java.util.Listorg.elasticsearch.client.indices.AnalyzeResponse.AnalyzeToken* throws* explain* Author Mhh* Date 2021/12/9 16:16*/Testpublic void breakUpText() throws IllegalAccessException, NoSuchFieldException, IOException {ListAnalyzeResponse.AnalyzeToken maxAnalyzeTokens elasticsearchSelectController.selectBreakUpText(ik_max_word, 北京天安门);//细粒度分词ListAnalyzeResponse.AnalyzeToken smartAnalyzeTokens elasticsearchSelectController.selectBreakUpText(ik_smart, 北京天安门);//粗粒度分词System.err.println(maxAnalyzeTokens细粒度的size: maxAnalyzeTokens.size() \n smartAnalyzeTokens粗粒度的size: smartAnalyzeTokens.size());}} 8.5 termQuery 查询文档(入参不分词精确匹配) termsQuery(String name, Object… values)termsQuery(String name, String… values)termsQuery(String name, long… values)termsQuery(String name, int… values)… name: 域(字段名) values:一域多值, 查询的值 termQuery 查询文档(入参不分词精确匹配)测试 入参不分词 会查询ES索引中文档(如果ES中索引文档被分词.只要匹配到词条就可以返回)values一域多值(只要匹配到一个值就可以返回) 8.5.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param key : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param values : 一域多值, 查询的值* return java.util.ListT* explain :词条查询不分词精确匹配* Author Mhh* Date 2021/12/10 14:28*/PostMapping(termQuery)public T ListT termQuery(String key, ClassT classType, String... values) {return elasticsearchSelectService.termQuery(key, classType, values);}}8.5.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param key : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param values : 一域多值, 查询的值* return java.util.ListT* explain :词条查询(不分前端传过来的数据)* Author Mhh* Date 2021/12/10 14:28*/public T ListT termQuery(String key, ClassT classType, String... values);} 8.5.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param key : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param values : 一域多值, 查询的值* return java.util.ListT* explain :词条查询(不分前端传过来的数据)* Author Mhh* Date 2021/12/10 14:28*/public T ListT termQuery(String key, ClassT classType, String... values) {//查询条件(词条查询对应ES query里的term)TermsQueryBuilder termsQueryBuilder QueryBuilders.termsQuery(key, values);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(termsQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} termQuery 查询文档(入参不分词精确匹配)测试结果 term查询查询text类型字段时只有其中的单词相匹配都会查到text字段会对数据进行分词term查询查询keyword类型字段时只有完全匹配才会查到keyword字段不会对数据进行分词term query会去倒排索引中寻找确切的term它并不知道分词器的存在。这种查询适合keyword 、numeric、date import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param key : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param values : 一域多值, 查询的值* return java.util.ListT* explain :词条查询不分词精确匹配* Author Mhh* Date 2021/12/10 14:28*/Testpublic void termQuery() {ListTeacher teacherList elasticsearchSelectController.termQuery(tAddress, Teacher.class, 泰安市, 河北省);teacherList.forEach(System.err::println);}} 8.6 match 查询文档(会对查询条件进行分词) matchQuery(String name, Object text) name: 域(字段名) text: 要查询的入参值 match查询文档(会对查询条件进行分词)测试 会对查询条件进行分词。将分词后的查询条件和词条进行等值匹配默认取并集OR 8.6.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** 入参分词: 山东省济南市 ik_smart粗粒度:[山东省,济南市] ik_max_word细粒度:[山东省,山东,省,济南市,济南,南市]** param operator : Operator.OR(并集) [默认] 只要分的词有一个和索引字段上对应上则就返回* Operator.AND(交集) 分的词全部满足的数据返回* param analyzer : 选择分词器[ik_smart粗粒度,ik_max_word细粒度] 默认:ik_max_word细粒度* param key : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param text : 查询的值* return java.util.ListT* explain matchQuery:词条分词查询(会对查询条件进行分词)* Author Mhh* Date 2021/12/10 15:21*/PostMapping(matchQuery)public T ListT matchQuery(Operator operator, String analyzer, String key, ClassT classType, String text) {return elasticsearchSelectService.matchQuery(operator, analyzer, key, classType, text);}}8.6.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** 入参分词: 山东省济南市 ik_smart粗粒度:[山东省,济南市] ik_max_word细粒度:[山东省,山东,省,济南市,济南,南市]** param operator : Operator.OR(并集) [默认] 只要分的词有一个和索引字段上对应上则就返回* Operator.AND(交集) 分的词全部满足的数据返回* param analyzer : 选择分词器[ik_smart粗粒度,ik_max_word细粒度] 默认:ik_max_word细粒度* param key : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param text : 查询的值* return java.util.ListT* explain matchQuery:词条分词查询(会对查询条件进行分词)* Author Mhh* Date 2021/12/10 15:21*/public T ListT matchQuery(Operator operator, String analyzer, String key, ClassT classType, String text);} 8.6.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** 入参分词: 山东省济南市 ik_smart粗粒度:[山东省,济南市] ik_max_word细粒度:[山东省,山东,省,济南市,济南,南市]** param operator : Operator.OR(并集) [默认] 只要分的词有一个和索引字段上对应上则就返回* Operator.AND(交集) 分的词全部满足的数据返回* param analyzer : 选择分词器[ik_smart粗粒度,ik_max_word细粒度] 默认:ik_max_word细粒度* param key : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param text : 查询的值* return java.util.ListT* explain matchQuery:词条分词查询(会对查询条件进行分词)* Author Mhh* Date 2021/12/10 15:21*/public T ListT matchQuery(Operator operator, String analyzer, String key, ClassT classType, String text) {//查询条件(词条查询对应ES query里的match)MatchQueryBuilder matchQueryBuilder QueryBuilders.matchQuery(key, text).analyzer(analyzer).operator(operator);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(matchQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} match 查询文档(会对查询条件进行分词)测试结果 match query知道分词器的存在。并且理解是如何被分词的Operator Operator.AND:交集(表示被分词后的值都包含在域(字段)中就返回此数据) Operator.OR: 并集(表示被分词后的值只要有一个被包含在域(字段)中就返回此数据) import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** 入参分词: 山东省济南市 ik_smart粗粒度:[山东省,济南市] ik_max_word细粒度:[山东省,山东,省,济南市,济南,南市]** param operator : Operator.OR(并集) [默认] 只要分的词有一个和索引字段上对应上则就返回* Operator.AND(交集) 分的词全部满足的数据返回* param analyzer : 选择分词器[ik_smart粗粒度,ik_max_word细粒度] 默认:ik_max_word细粒度* param key : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param text : 查询的值* return java.util.ListT* explain matchQuery:词条分词查询(会对查询条件进行分词)* Author Mhh* Date 2021/12/10 15:21*/Testpublic void matchQuery() {ListTeacher teacherList elasticsearchSelectController.matchQuery(Operator.AND,ik_smart,tAddress,Teacher.class,山东省济南市);teacherList.forEach(System.err::println);}} 8.7 matchAllQuery 查询文档(查询此索引下所有文档) matchAllQuery():匹配所有文档的查询。 matchAllQuery 查询文档(查询此索引下所有文档)测试 查询指定索引下所有文档 (默认十条) 8.7.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param classType :返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 返回索引库里所有数据* Author Mhh* Date 2021/12/10 15:44*/PostMapping(matchAllQuery)public T ListT matchAllQuery(ClassT classType) {return elasticsearchSelectService.matchAllQuery(classType);}}8.7.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param classType :返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 返回索引库里所有数据* Author Mhh* Date 2021/12/10 15:44*/public T ListT matchAllQuery(ClassT classType);} 8.7.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param classType :返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 返回索引库里所有数据* Author Mhh* Date 2021/12/10 15:44*/public T ListT matchAllQuery(ClassT classType) {//查询条件(词条查询对应ES query里的match)MatchAllQueryBuilder matchAllQueryBuilder QueryBuilders.matchAllQuery();//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(matchAllQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} matchAllQuery 查询文档(查询此索引下所有文档)测试结果 通过入参对象里面Document注解indexName属性获取查询哪个索引返回指定索引下所有文档 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param classType :返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 返回索引库里所有数据* Author Mhh* Date 2021/12/10 15:44*/Testpublic void matchAllQuery() {ListTeacher teacherList elasticsearchSelectController.matchAllQuery(Teacher.class);teacherList.forEach(System.err::println);}
} 8.8 wildcardQuery 查询文档(模糊查询) wildcardQuery(String name, String query) name: 域名(字段名称) query: 通配符查询字符串 wildcardQuery 查询文档(模糊查询)测试 wildcard查询会对查询条件进行分词,还可以使用通配符? : 任意单个字符* : 0个或多个字符 8.8.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/** ?:只包含一个字符* 山?省: 山东省 或者 山西省 等等 ?包含一个字符* ??省 山东省 或者 吉林省 等等 ?包含一个字符* ???: 你好啊 或者 早上好 等等 ?包含一个字符** *:表示0个或多个字符* 济南* 济南市 或者 济南市历下区..... *表示0个或多个字符* *剑 长虹剑 或者 冰魄长虹倚天剑.... *表示0个或多个字符** 注意: *或者?放在最前面(例如*省 | ?省 *为 | ?为) 会引发全表(全索引)扫描 注意效率问题* *//*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : wildcardQuery模糊查询(会对查询条件分词还可以使用通配符)[?:表示任意单个字符][*:表示0或多个字符]* Author Mhh* Date 2021/12/10 16:10*/PostMapping(wildcardQuery)public T ListT wildcardQuery(String key, String value, ClassT classType) {return elasticsearchSelectService.wildcardQuery(key, value, classType);}}8.8.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/** ?:只包含一个字符* 山?省: 山东省 或者 山西省 等等 ?包含一个字符* ??省 山东省 或者 吉林省 等等 ?包含一个字符* ???: 你好啊 或者 早上好 等等 ?包含一个字符** *:表示0个或多个字符* 济南* 济南市 或者 济南市历下区..... *表示0个或多个字符* *剑 长虹剑 或者 冰魄长虹倚天剑.... *表示0个或多个字符** 注意: *或者?放在最前面(例如*省 | ?省 *为 | ?为) 会引发全表(全索引)扫描 注意效率问题* *//*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : wildcardQuery模糊查询(会对查询条件分词还可以使用通配符)[?:表示任意单个字符][*:表示0或多个字符]* Author Mhh* Date 2021/12/10 16:10*/public T ListT wildcardQuery(String key, String value, ClassT classType);} 8.8.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/** ?:只包含一个字符* 山?省: 山东省 或者 山西省 等等 ?包含一个字符* ??省 山东省 或者 吉林省 等等 ?包含一个字符* ???: 你好啊 或者 早上好 等等 ?包含一个字符** *:表示0个或多个字符* 济南* 济南市 或者 济南市历下区..... *表示0个或多个字符* *剑 长虹剑 或者 冰魄长虹倚天剑.... *表示0个或多个字符** 注意: *或者?放在最前面(例如*省 | ?省 *为 | ?为) 会引发全表(全索引)扫描 注意效率问题* *//*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : wildcardQuery模糊查询(会对查询条件分词还可以使用通配符)[?:表示任意单个字符][*:表示0或多个字符]* Author Mhh* Date 2021/12/10 16:10*/public T ListT wildcardQuery(String key, String value, ClassT classType) {//查询条件(词条查询对应ES query里的wildcard)WildcardQueryBuilder wildcardQueryBuilder QueryBuilders.wildcardQuery(key, value);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(wildcardQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} wildcardQuery 查询文档(模糊查询)测试结果 *华* 包含华字的华* 华字后边零个或多个字符华? 华字后边一个字符*华或?华 会引发全表全索引扫描 注意效率问题 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : wildcardQuery模糊查询(会对查询条件分词还可以使用通配符)[?:表示任意单个字符][*:表示0或多个字符]* Author Mhh* Date 2021/12/10 16:10*/Testpublic void wildcardQuery() {ListTeacher teacherList elasticsearchSelectController.wildcardQuery(tAddress,山?省,Teacher.class);teacherList.forEach(System.err::println);}
} 8.9 prefixQuery 查询文档(前缀查询) prefixQuery(String name, String prefix) name: 域名(字段名称) prefix: 前缀值查询 prefixQuery 查询文档(前缀查询)测试 前缀查询 对keyword类型支持比较好 8.9.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : prefixQuery 前缀查询 对keyword类型支持比较好(text也能用:索引库字段分词后 分的词前缀要是能匹配也是可以返回此数据)* Author Mhh* Date 2021/12/10 16:49*/PostMapping(prefixQuery)public T ListT prefixQuery(String key, String value, ClassT classType) {return elasticsearchSelectService.prefixQuery(key, value, classType);}}8.9.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : prefixQuery 前缀查询 对keyword类型支持比较好(text也能用:索引库字段分词后 分的词前缀要是能匹配也是可以返回此数据)* Author Mhh* Date 2021/12/10 16:49*/public T ListT prefixQuery(String key, String value, ClassT classType);
} 8.9.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : prefixQuery 前缀查询 对keyword类型支持比较好(text也能用:索引库字段分词后 分的词前缀要是能匹配也是可以返回此数据)* Author Mhh* Date 2021/12/10 16:49*/public T ListT prefixQuery(String key, String value, ClassT classType) {//查询条件(词条查询对应ES query里的prefixQuery)PrefixQueryBuilder prefixQueryBuilder QueryBuilders.prefixQuery(key, value);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(prefixQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} prefixQuery 查询文档(前缀查询)测试结果 text也能用:索引库字段分词后 分的词前缀要是能匹配也是可以返回此数据 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : prefixQuery 前缀查询 对keyword类型支持比较好(text也能用:索引库字段分词后 分的词前缀要是能匹配也是可以返回此数据)* Author Mhh* Date 2021/12/10 16:49*/Testpublic void prefixQuery() {ListTeacher teacherList elasticsearchSelectController.prefixQuery(tAddress,济,Teacher.class);teacherList.forEach(System.err::println);}
} 8.10 regexpQuery 查询文档(正则表达式查询) regexpQuery(String name, String regexp) name: 域名(字段名称) regexp: 正则表达式 regexpQuery 查询文档(正则表达式查询)测试 匹配包含具有指定正则表达式的术语的文档的查询菜鸟教程-正则表达式: 正则表达式 – 语法 | 菜鸟教程. 8.10.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 正则表达式查询:regexpQuery* Author Mhh* Date 2021/12/11 19:17*/PostMapping(regexpQuery)public T ListT regexpQuery(String key, String value, ClassT classType) {return elasticsearchSelectService.regexpQuery(key, value, classType);}}8.10.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 正则表达式查询:regexpQuery* Author Mhh* Date 2021/12/11 19:17*/public T ListT regexpQuery(String key, String value, ClassT classType);} 8.10.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 正则表达式查询:regexpQuery* Author Mhh* Date 2021/12/11 19:17*/public T ListT regexpQuery(String key, String value, ClassT classType) {//查询条件(词条查询对应ES query里的regexpQuery)RegexpQueryBuilder regexpQueryBuilder QueryBuilders.regexpQuery(key, value);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(regexpQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}
} regexpQuery 查询文档(正则表达式查询) 测试结果 正则查询取决于正则表达式的效率 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param key : es里索引的域(字段名)* param value : 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 正则表达式查询:regexpQuery* Author Mhh* Date 2021/12/11 19:17*/Testpublic void regexpQuery() {ListTeacher teacherEnglishNameList elasticsearchSelectController.regexpQuery(tEnglishName,b(.)*,Teacher.class);teacherEnglishNameList.forEach(System.err::println);System.out.println(---------------------------------------);ListTeacher teacherNameList elasticsearchSelectController.regexpQuery(tName,小白(.)*,Teacher.class);teacherNameList.forEach(System.err::println);}} 8.11 rangeQuery 查询文档(范围查询) rangeQuery(String name).from(Object from,boolean includeLower).to(Object to,boolean includeLower) name: 域名(字段名称) from: 范围查询的from部分, Null 表示无界 includeLower是否包含 默认为true[包含] to: 范围查询的to部分, Null 表示无界 includeLower是否包含 默认为true[包含] rangeQuery 查询文档(范围查询) 测试 支持范围查询的字段类型有:数值、日期、地址的IP范围。 8.11.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param name :es里索引的域(字段名)* param from :范围查询值 1 from(Object from, boolean includeLower) includeLower是否包含 默认为true[包含]* // 如果fromnull 那么就是to的* param to :范围查询值 2 to(Object to, boolean includeUpper) includeLower是否包含 默认为true[包含]* // 如果tonull 那么就是 from的* param classType :返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : rangeQuery 范围查询* Author Mhh* Date 2021/12/12 18:13*/PostMapping(rangeQuery)public T ListT rangeQuery(String name, Integer from, Integer to, ClassT classType) {return elasticsearchSelectService.rangeQuery(name, from, to, classType);}
}8.11.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param name :es里索引的域(字段名)* param from :范围查询值 1 from(Object from, boolean includeLower) includeLower是否包含 默认为true[包含]* // 如果fromnull 那么就是to的* param to :范围查询值 2 to(Object to, boolean includeUpper) includeLower是否包含 默认为true[包含]* // 如果tonull 那么就是 from的* param classType :返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : rangeQuery 范围查询* Author Mhh* Date 2021/12/12 18:13*/public T ListT rangeQuery(String name, Integer from, Integer to, ClassT classType);} 8.11.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param name :es里索引的域(字段名)* param from :范围查询值 1 from(Object from, boolean includeLower) includeLower是否包含 默认为true[包含]* // 如果fromnull 那么就是to的* param to :范围查询值 2 to(Object to, boolean includeUpper) includeLower是否包含 默认为true[包含]* // 如果tonull 那么就是 from的* param classType :返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : rangeQuery 范围查询* Author Mhh* Date 2021/12/12 18:13*/public T ListT rangeQuery(String name, Integer from, Integer to, ClassT classType) {//查询条件(词条查询对应ES query里的rangeQuery)RangeQueryBuilder rangeQueryBuilder QueryBuilders.rangeQuery(name).from(from).to(to);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(rangeQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} rangeQuery 查询文档(范围查询) 测试结果 includeLowertrue;(是否包含 默认为true[包含]) 如果fromnull 那么就是to的如果tonull 那么就是 from的如果 from!null to!null 那么就是fromto的 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param name :es里索引的域(字段名)* param from :范围查询值 1 from(Object from, boolean includeLower) includeLower是否包含 默认为true[包含]* // 如果fromnull 那么就是to的* param to :范围查询值 2 to(Object to, boolean includeUpper) includeLower是否包含 默认为true[包含]* // 如果tonull 那么就是 from的* param classType :返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : rangeQuery 范围查询* Author Mhh* Date 2021/12/12 18:13*/Testpublic void rangeQuery() {ListTeacher lteTeacherList elasticsearchSelectController.rangeQuery(tAge, null, 18, Teacher.class);lteTeacherList.forEach(System.err::println);System.out.println(-------------------------------------);ListTeacher gteTeacherList elasticsearchSelectController.rangeQuery(tAge, 18, null, Teacher.class);gteTeacherList.forEach(System.err::println);}} 8.12 Sort 查询文档 (排序) addSort(Sort sort): 添加排序 by(Sort.Direction direction, String… properties) direction : 排序 Sort.Direction.ASC:升序 || Sort.Direction.DESC:降序 properties : 域名(可变参数,可传1至多个) Sort 查询文档 (排序) 测试 在排序的过程中只能使用可排序的属性进行排序(数字、日期) 8.12.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param direction : 排序 Sort.Direction.ASC:升序 || Sort.Direction.DESC:降序* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param properties : 域名(可变参数,可传1至多个)* return java.util.ListT* explain : 给查询 结果排序* Author Mhh* Date 2021/12/12 18:45*/PostMapping(sort)public T ListT sort(Sort.Direction direction, ClassT classType, String... properties) {return elasticsearchSelectService.sort(direction, classType, properties);}
}8.12.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param direction : 排序 Sort.Direction.ASC:升序 || Sort.Direction.DESC:降序* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param properties : 域名(可变参数,可传1至多个)* return java.util.ListT* explain : 给查询 结果排序* Author Mhh* Date 2021/12/12 18:45*/public T ListT sort(Sort.Direction direction, ClassT classType, String... properties);} 8.12.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param direction : 排序 Sort.Direction.ASC:升序 || Sort.Direction.DESC:降序* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param properties : 域名(可变参数,可传1至多个)* return java.util.ListT* explain : 给查询 结果排序* Author Mhh* Date 2021/12/12 18:45*/public T ListT sort(Sort.Direction direction, ClassT classType, String... properties) {//查询条件(词条查询对应ES query里的sort)MatchAllQueryBuilder matchAllQueryBuilder QueryBuilders.matchAllQuery();//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(matchAllQueryBuilder);nativeSearchQuery.addSort(Sort.by(direction, properties));//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} Sort 查询文档 (排序) 测试结果 ES支持多级排序—sort : 将查询结果首先按第一个自定义条件排序当第一个 sort 值完全相同时再按照第二个条件进行排序以此类推。 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param direction : 排序 Sort.Direction.ASC:升序 || Sort.Direction.DESC:降序* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param properties : 域名(可变参数,可传1至多个)* return java.util.ListT* explain : 给查询 结果排序* Author Mhh* Date 2021/12/12 18:45*/Testpublic void sort() {ListTeacher ascTeacherList elasticsearchSelectController.sort(Sort.Direction.ASC, Teacher.class, tAge);ascTeacherList.forEach(System.err::println);System.out.println(------------------------------------);ListTeacher descTeacherList elasticsearchSelectController.sort(Sort.Direction.DESC, Teacher.class, tAge);descTeacherList.forEach(System.err::println);}} 8.13 queryStringQuery 查询文档 (多条件查询 一值多域) queryStringQuery(String queryString).fields(MapString, Float fields).analyzer(String analyzer).defaultOperator(Operator defaultOperator) queryString : 要运行的查询字符串 fields : 添加多个域(字段)以及针对特定权重进行查询。 analyzer : 选择分词器(对查询的只进行分词) defaultOperator : Operator.OR 并集 || Operator.AND 交集 queryStringQuery 查询文档 (多条件查询 一值多域) 测试 queryString 多条件查询会对查询条件进行分词。将分词后的查询条件和词条进行等值匹配默认取并集OR可以指定多个查询字段query_string识别query中的连接符or 、and 8.13.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/** 多域查询的交并集理解:* OR: 只要有一个域中包含入参value被分词后的一个值时就返回* AND: 只要有一个域中包含入参value被分词后的所有值时返回** param fields : MapString,Float类型:key为域名,Float为boost值* boost: 参数被用来提升一个语句的相对权重 boost 值大于 1 或降低相对权重 boost 值处于 0 到 1 之间但是这种提升或降低并不是线性的换句话说如果一个 boost 值为 2 并不能获得两倍的评分 _score 。* param queryString : 要查询的值 (会对查询条件进行分词)* param analyzer : 选择分词器[ik_smart粗粒度,ik_max_word细粒度] 默认:ik_max_word细粒度* param operator : Operator.OR(并集) [默认] 只要分的词有一个和索引字段上对应上则就返回* Operator.AND(交集) 分的词全部满足的数据返回* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : queryString 多条件查询* •会对查询条件进行分词。* •然后将分词后的查询条件和词条进行等值匹配* •默认取并集OR* •可以指定多个查询字段* •query_string识别query中的连接符or 、and* Author Mhh* Date 2021/12/12 19:45*/PostMapping(queryStringQuery)public T ListT queryStringQuery(MapString, Float fields, String queryString, String analyzer, Operator operator, ClassT classType) {return elasticsearchSelectService.queryStringQuery(fields, queryString, analyzer, operator, classType);}
}8.13.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/** 多域查询的交并集理解:* OR: 只要有一个域中包含入参value被分词后的一个值时就返回* AND: 只要有一个域中包含入参value被分词后的所有值时返回** param fields : MapString,Float类型:key为域名,Float为boost值* boost: 参数被用来提升一个语句的相对权重 boost 值大于 1 或降低相对权重 boost 值处于 0 到 1 之间但是这种提升或降低并不是线性的换句话说如果一个 boost 值为 2 并不能获得两倍的评分 _score 。* param queryString : 要查询的值 (会对查询条件进行分词)* param analyzer : 选择分词器[ik_smart粗粒度,ik_max_word细粒度] 默认:ik_max_word细粒度* param operator : Operator.OR(并集) [默认] 只要分的词有一个和索引字段上对应上则就返回* Operator.AND(交集) 分的词全部满足的数据返回* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : queryString 多条件查询* •会对查询条件进行分词。* •然后将分词后的查询条件和词条进行等值匹配* •默认取并集OR* •可以指定多个查询字段* •query_string识别query中的连接符or 、and* Author Mhh* Date 2021/12/12 19:45*/public T ListT queryStringQuery(MapString, Float fields, String queryString, String analyzer, Operator operator, ClassT classType);} 8.13.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/** 多域查询的交并集理解:* OR: 只要有一个域中包含入参value被分词后的一个值时就返回* AND: 只要有一个域中包含入参value被分词后的所有值时返回** param fields : MapString,Float类型:key为域名,Float为boost值* boost: 参数被用来提升一个语句的相对权重 boost 值大于 1 或降低相对权重 boost 值处于 0 到 1 之间但是这种提升或降低并不是线性的换句话说如果一个 boost 值为 2 并不能获得两倍的评分 _score 。* param queryString : 要查询的值 (会对查询条件进行分词)* param analyzer : 选择分词器[ik_smart粗粒度,ik_max_word细粒度] 默认:ik_max_word细粒度* param operator : Operator.OR(并集) [默认] 只要分的词有一个和索引字段上对应上则就返回* Operator.AND(交集) 分的词全部满足的数据返回* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : queryString 多条件查询* •会对查询条件进行分词。* •然后将分词后的查询条件和词条进行等值匹配* •默认取并集OR* •可以指定多个查询字段* •query_string识别query中的连接符or 、and* Author Mhh* Date 2021/12/12 19:45*/public T ListT queryStringQuery(MapString, Float fields, String queryString, String analyzer, Operator operator, ClassT classType) {//查询条件(词条查询对应ES query里的queryStringQuery)QueryStringQueryBuilder queryStringQueryBuilder QueryBuilders.queryStringQuery(queryString).fields(fields).analyzer(analyzer).defaultOperator(operator);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(queryStringQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} queryStringQuery 查询文档 (多条件查询 一值多域) 测试结果 query中的or and 是查询时 匹配条件是否同时出现----or 出现一个即可and 两个条件同时出现default_operator的or and 是对结果进行 并集or、交集and import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/** 多域查询的交并集理解:* OR: 只要有一个域中包含入参value被分词后的一个值时就返回* AND: 只要有一个域中包含入参value被分词后的所有值时返回** param fields : MapString,Float类型:key为域名,Float为boost值* boost: 参数被用来提升一个语句的相对权重 boost 值大于 1 或降低相对权重 boost 值处于 0 到 1 之间但是这种提升或降低并不是线性的换句话说如果一个 boost 值为 2 并不能获得两倍的评分 _score 。* param queryString : 要查询的值 (会对查询条件进行分词)* param analyzer : 选择分词器[ik_smart粗粒度,ik_max_word细粒度] 默认:ik_max_word细粒度* param operator : Operator.OR(并集) [默认] 只要分的词有一个和索引字段上对应上则就返回* Operator.AND(交集) 分的词全部满足的数据返回* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : queryString 多条件查询* •会对查询条件进行分词。* •然后将分词后的查询条件和词条进行等值匹配* •默认取并集OR* •可以指定多个查询字段* •query_string识别query中的连接符or 、and* Author Mhh* Date 2021/12/12 19:45*/Testpublic void queryStringQuery() throws IllegalAccessException, NoSuchFieldException, IOException {
// ListAnalyzeResponse.AnalyzeToken analyzeTokens elasticsearchSelectController.selectBreakUpText(ik_smart, black是河北省的);MapString, Float fields new HashMap();fields.put(tAddress, (float) 1);fields.put(tEnglishName, (float) 1);ListTeacher teacherList elasticsearchSelectController.queryStringQuery(fields,black是山东省的,ik_smart,Operator.OR,Teacher.class);teacherList.forEach(System.err::println);}} 8.14 boolQuery 查询文档 (对多个查询条件连接。连接方式must) must(QueryBuilder queryBuilder) queryBuilder: 查询语法 包含(term查询、terms查询、match查询、范围查询、模糊查询…) boolQuery 查询文档 (对多个查询条件连接。连接方式must) 测试 mustand条件必须成立must和filter配合使用时max_score得分是显示的must 可以是单个条件也可以对各条件 (默认数组形式)maxSore(得分) : 即条件匹配度,匹配度越高得分越高 8.14.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** ------boolQuery子句用termsQuery做的测试* // fields: 只要有一条数据包含fields 都包含value数组中的一种就能返回** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须满足must子句的条件,并且参与计算分值* // 条件必须成立性能比filter低。会计算得分* // 对多个查询条件连接。连接方式mustand条件必须成立(会计算得分)* // maxSore(得分):即条件匹配度,匹配度越高得分越高* Author Mhh* Date 2021/12/13 10:31*/PostMapping(boolQueryBuilderByMust)public T ListT boolQueryBuilderByMust(MapString, String[] fields, ClassT classType) {return elasticsearchSelectService.boolQueryBuilderByMust(fields, classType);}
}8.14.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** ------boolQuery子句用termsQuery做的测试* // fields: 只要有一条数据包含fields 都包含value数组中的一种就能返回** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须满足must子句的条件,并且参与计算分值* // 条件必须成立性能比filter低。会计算得分* // 对多个查询条件连接。连接方式mustand条件必须成立(会计算得分)* // maxSore(得分):即条件匹配度,匹配度越高得分越高* Author Mhh* Date 2021/12/13 10:31*/public T ListT boolQueryBuilderByMust(MapString, String[] fields, ClassT classType);} 8.14.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** ------boolQuery子句用termsQuery做的测试* // fields: 只要有一条数据包含fields 都包含value数组中的一种就能返回** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须满足must子句的条件,并且参与计算分值* // 条件必须成立性能比filter低。会计算得分* // 对多个查询条件连接。连接方式mustand条件必须成立(会计算得分)* // maxSore(得分):即条件匹配度,匹配度越高得分越高* Author Mhh* Date 2021/12/13 10:31*/public T ListT boolQueryBuilderByMust(MapString, String[] fields, ClassT classType) {//构建boolQuery(词条查询对应ES query里的bool)对多个查询条件连接BoolQueryBuilder boolQueryBuilder QueryBuilders.boolQuery();fields.forEach((key, value1) - {//查询条件(词条查询对应ES query里的termQuery)TermsQueryBuilder termsQueryBuilder QueryBuilders.termsQuery(key, value1);//mustand条件必须成立boolQueryBuilder.must(termsQueryBuilder);});//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(boolQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} boolQuery 查询文档 (对多个查询条件连接。连接方式must) 测试结果 条件必须成立性能比filter低。会计算得分 可以手动修改得分(得分越高越靠前) import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** ------boolQuery子句用termsQuery做的测试* // fields: 只要有一条数据包含fields 都包含value数组中的一种就能返回** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须满足must子句的条件,并且参与计算分值* // 条件必须成立性能比filter低。会计算得分* // 对多个查询条件连接。连接方式mustand条件必须成立(会计算得分)* // maxSore(得分):即条件匹配度,匹配度越高得分越高* Author Mhh* Date 2021/12/13 10:31*/Testpublic void boolQueryBuilderByMust() {MapString, String[] fields new HashMap();fields.put(tAddress, new String[]{山东省});fields.put(tEnglishName, new String[]{black});fields.put(tAge, new String[]{15});ListTeacher teacherList elasticsearchSelectController.boolQueryBuilderByMust(fields,Teacher.class);teacherList.forEach(System.err::println);}} 8.15 boolQuery 查询文档 (对多个查询条件连接。连接方式filter) filter(QueryBuilder queryBuilder) queryBuilder: 查询语法 包含(term查询、terms查询、match查询、范围查询、模糊查询…) boolQuery 查询文档 (对多个查询条件连接。连接方式filter) 测试 filterand条件必须成立filter : 可以是单个条件也可以对各条件 (默认数组形式)filter : 单独使用不会计算得分 8.15.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** ------boolQuery子句用termsQuery做的测试* // fields: 只要有一条数据包含fields 都包含value数组中的一种就能返回** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(must:数组中多值是或者的关系只要是所有字段能对应到数组中至少一个值就可以返回)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值* // 对多个查询条件连接。连接方式filter(and)条件必须成立性能比must高。不会计算得分* // maxSore(得分):即条件匹配度,匹配度越高得分越高* Author Mhh* Date 2021/12/13 10:31*/PostMapping(boolQueryBuilderByFilter)public T ListT boolQueryBuilderByFilter(MapString, String[] fields, ClassT classType) {return elasticsearchSelectService.boolQueryBuilderByFilter(fields, classType);}}8.15.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** ------boolQuery子句用termsQuery做的测试* // fields: 只要有一条数据包含fields 都包含value数组中的一种就能返回** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(must:数组中多值是或者的关系只要是所有字段能对应到数组中至少一个值就可以返回)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值* // 对多个查询条件连接。连接方式filter(and)条件必须成立性能比must高。不会计算得分* // maxSore(得分):即条件匹配度,匹配度越高得分越高* Author Mhh* Date 2021/12/13 10:31*/public T ListT boolQueryBuilderByFilter(MapString, String[] fields, ClassT classType);} 8.15.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** ------boolQuery子句用termsQuery做的测试* // fields: 只要有一条数据包含fields 都包含value数组中的一种就能返回** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(must:数组中多值是或者的关系只要是所有字段能对应到数组中至少一个值就可以返回)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值* // 对多个查询条件连接。连接方式filter(and)条件必须成立性能比must高。不会计算得分* // maxSore(得分):即条件匹配度,匹配度越高得分越高* Author Mhh* Date 2021/12/13 10:31*/public T ListT boolQueryBuilderByFilter(MapString, String[] fields, ClassT classType) {//构建boolQuery(词条查询对应ES query里的bool)对多个查询条件连接BoolQueryBuilder boolQueryBuilder QueryBuilders.boolQuery();fields.forEach((key, value1) - {//查询条件(词条查询对应ES query里的termQuery)TermsQueryBuilder termsQueryBuilder QueryBuilders.termsQuery(key, value1);//mustand条件必须成立boolQueryBuilder.filter(termsQueryBuilder);});//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(boolQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} boolQuery 查询文档 (对多个查询条件连接。连接方式filter) 测试结果 filter条件必须成立性能比must高。不会计算得分 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** ------boolQuery子句用termsQuery做的测试* // fields: 只要有一条数据包含fields 都包含value数组中的一种就能返回** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(must:数组中多值是或者的关系只要是所有字段能对应到数组中至少一个值就可以返回)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值* // 对多个查询条件连接。连接方式filter(and)条件必须成立性能比must高。不会计算得分* // maxSore(得分):即条件匹配度,匹配度越高得分越高* Author Mhh* Date 2021/12/13 10:31*/Testpublic void boolQueryBuilderByFilter() {MapString, String[] fields new HashMap();fields.put(tAddress, new String[]{山东省, 山西省});fields.put(tEnglishName, new String[]{black, green});fields.put(tAge, new String[]{15, 24});ListTeacher teacherList elasticsearchSelectController.boolQueryBuilderByFilter(fields,Teacher.class);teacherList.forEach(System.err::println);}} 8.16 boolQuery 查询文档 (对多个查询条件连接。连接方式must_not) mustNot(QueryBuilder queryBuilder) queryBuilder: 查询语法 包含(term查询、terms查询、match查询、范围查询、模糊查询…) boolQuery 查询文档 (对多个查询条件连接。连接方式must_not) 测试 must_notnot条件必须不成立must_not : 可以是单个条件也可以对各条件 (默认数组形式) 8.16.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** ------boolQuery子句用termsQuery做的测试** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(must_not:只要是所有字段都对应不到数组中的值就可以返回)* //fields 只要数据不包含在 value数组中指定的返回* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须不满足定义的条件* // 对多个查询条件连接。连接方式must_notnot条件必须不成立* Author Mhh* Date 2021/12/19 18:55*/PostMapping(boolQueryBuilderByMustNot)public T ListT boolQueryBuilderByMustNot(MapString, String[] fields, ClassT classType) {return elasticsearchSelectService.boolQueryBuilderByMustNot(fields, classType);}}8.16.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** ------boolQuery子句用termsQuery做的测试** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值* //fields 只要数据不包含在 value数组中指定的返回* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须不满足定义的条件* // 对多个查询条件连接。连接方式must_notnot条件必须不成立* Author Mhh* Date 2021/12/19 18:55*/public T ListT boolQueryBuilderByMustNot(MapString, String[] fields, ClassT classType);} 8.16.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** ------boolQuery子句用termsQuery做的测试** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值* //fields 只要数据不包含在 value数组中指定的返回* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须不满足定义的条件* // 对多个查询条件连接。连接方式must_notnot条件必须不成立* Author Mhh* Date 2021/12/19 18:55*/public T ListT boolQueryBuilderByMustNot(MapString, String[] fields, ClassT classType) {//构建boolQuery(词条查询对应ES query里的bool)对多个查询条件连接BoolQueryBuilder boolQueryBuilder QueryBuilders.boolQuery();fields.forEach((key, value1) - {//查询条件(词条查询对应ES query里的termQuery)TermsQueryBuilder termsQueryBuilder QueryBuilders.termsQuery(key, value1);//mustand条件必须成立boolQueryBuilder.mustNot(termsQueryBuilder);});//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(boolQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} boolQuery 查询文档 (对多个查询条件连接。连接方式must_not) 测试结果 must_not返回文档查询到不满足定义的条件 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** ------boolQuery子句用termsQuery做的测试** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(must_not:只要是所有字段都对应不到数组中的值就可以返回)* //fields 只要数据不包含在 value数组中指定的返回* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档必须不满足定义的条件* // 对多个查询条件连接。连接方式must_notnot条件必须不成立* Author Mhh* Date 2021/12/19 18:55*/Testpublic void boolQueryBuilderByMustNot() {MapString, String[] fields new HashMap();fields.put(tAddress, new String[]{山东省});fields.put(tEnglishName, new String[]{black});fields.put(tAge, new String[]{24, 21});ListTeacher teacherList elasticsearchSelectController.boolQueryBuilderByMustNot(fields,Teacher.class);teacherList.forEach(System.err::println);}} 8.17 boolQuery 查询文档 (对多个查询条件连接。连接方式should) should(QueryBuilder queryBuilder) queryBuilder: 查询语法 包含(term查询、terms查询、match查询、范围查询、模糊查询…) boolQuery 查询文档 (对多个查询条件连接。连接方式should) 测试 shouldor条件可以成立minimumShouldMatch : 参数定义了至少满足几个子句should : 可以是单个条件也可以对各条件 (默认数组形式) 8.17.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** ------boolQuery子句用termsQuery做的测试** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(should:只要有一条数据对应的字段包含 value数组的值就返回)* // 只要有一条数据对应的字段包含 value数组的值就返回* param minimumShouldMatch : 参数定义了至少满足几个子句* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档可能满足should子句的条件.* // 在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回* Author Mhh* Date 2021/12/19 19:23*/PostMapping(boolQueryBuilderByShould)public T ListT boolQueryBuilderByShould(MapString, String[] fields, Integer minimumShouldMatch, ClassT classType) {return elasticsearchSelectService.boolQueryBuilderByShould(fields, minimumShouldMatch, classType);}}8.17.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** ------boolQuery子句用termsQuery做的测试** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(should:只要有一条数据对应的字段包含 value数组的值就返回)* //只要有一条数据对应的字段包含 value数组的值就返回* param minimumShouldMatch : 参数定义了至少满足几个子句* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档可能满足should子句的条件.* // 在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回* Author Mhh* Date 2021/12/19 19:23*/public T ListT boolQueryBuilderByShould(MapString, String[] fields, Integer minimumShouldMatch, ClassT classType);} 8.17.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** ------boolQuery子句用termsQuery做的测试** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(should:只要有一条数据对应的字段包含 value数组的值就返回)* //只要有一条数据对应的字段包含 value数组的值就返回* param minimumShouldMatch : 参数定义了至少满足几个子句* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档可能满足should子句的条件.* // 在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回* Author Mhh* Date 2021/12/19 19:23*/public T ListT boolQueryBuilderByShould(MapString, String[] fields, Integer minimumShouldMatch, ClassT classType) {//构建boolQuery(词条查询对应ES query里的bool)对多个查询条件连接BoolQueryBuilder boolQueryBuilder QueryBuilders.boolQuery();fields.forEach((key, value1) - {//查询条件(词条查询对应ES query里的termQuery)TermsQueryBuilder termsQueryBuilder QueryBuilders.termsQuery(key, value1);//mustand条件必须成立boolQueryBuilder.should(termsQueryBuilder);});//参数定义了至少满足几个子句boolQueryBuilder.minimumShouldMatch(minimumShouldMatch);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQuery(boolQueryBuilder);//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} boolQuery 查询文档 (对多个查询条件连接。连接方式should) 测试结果 minimumShouldMatch : 参数定义了至少满足几个子句minimumShouldMatch2:表示必须满足两个子句才能返回 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** ------boolQuery子句用termsQuery做的测试** param fields :MapString,String[] key:es索引库里的域(字段名), value数组:一域多值, 查询的值(should:只要有一条数据对应的字段包含 value数组的值就返回)* // 只要有一条数据对应的字段包含 value数组的值就返回* param minimumShouldMatch : 参数定义了至少满足几个子句* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : boolQuery返回的文档可能满足should子句的条件.* // 在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回* Author Mhh* Date 2021/12/19 19:23*/Testpublic void boolQueryBuilderByShould() {MapString, String[] fields new HashMap();fields.put(tAddress, new String[]{山西省});fields.put(tEnglishName, new String[]{green, yellow});
// fields.put(tAge, new String[]{24});ListTeacher teacherList elasticsearchSelectController.boolQueryBuilderByShould(fields,2,Teacher.class);teacherList.forEach(System.err::println);}} 8.18 HighlightBuilder 查询文档 (高亮) new HighlightBuilder().field(String name).preTags(String… preTags).postTags(String… postTags) name : 要突出显示(高亮)的字段 preTags : 设置将用于突出显示的预标签。[前缀] postTags : 设置将用于突出显示的帖子标签。[后缀] HighlightBuilder 查询文档 (高亮) 测试 实施步骤 高亮查询 1. 设置高亮 高亮字段 前缀 后缀 2. 将高亮了的字段数据替换原有数据 8.18.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param field : 高亮字段 也是 match要查询的字段* param preTags : 高亮前缀* param postTags : 高亮后缀* param text : 查询的值(会分词)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 给查询到的值进行高亮* Author Mhh* Date 2021/12/21 15:15*/PostMapping(highlightBuilder)public T ListT highlightBuilder(String field, String preTags, String postTags, String text, ClassT classType) {return elasticsearchSelectService.highlightBuilder(field, preTags, postTags, text, classType);}}8.18.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param field : 高亮字段 也是 match要查询的字段* param preTags : 高亮前缀* param postTags : 高亮后缀* param text : 查询的值(会分词)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 给查询到的值进行高亮* Author Mhh* Date 2021/12/21 15:15*/public T ListT highlightBuilder(String field, String preTags, String postTags, String text, ClassT classType);} 8.18.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param field : 高亮字段 也是 match要查询的字段* param preTags : 高亮前缀* param postTags : 高亮后缀* param text : 查询的值(会分词)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 给查询到的值进行高亮* Author Mhh* Date 2021/12/21 15:15*/public T ListT highlightBuilder(String field, String preTags, String postTags, String text, ClassT classType) {//查询条件(词条查询对应ES query里的match)MatchQueryBuilder matchQueryBuilder QueryBuilders.matchQuery(field, text);////设置高亮三要素 field: 你的高亮字段 // preTags 前缀 // postTags后缀HighlightBuilder highlightBuilder new HighlightBuilder().field(field).preTags(preTags).postTags(postTags);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQueryBuilder().withQuery(matchQueryBuilder).withHighlightBuilder(highlightBuilder).build();//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();//获取值返回return search.getSearchHits().stream().map(searchHit - {//获得结果实体T content searchHit.getContent();//所有高亮结果MapString, ListString highlightFields searchHit.getHighlightFields();//遍历高亮结果for (Map.EntryString, ListString stringListEntry : highlightFields.entrySet()) {String key stringListEntry.getKey();//获取实体反射类Class? aClass content.getClass();try {//获取该实体属性Field declaredField aClass.getDeclaredField(key);//权限为私的 解除declaredField.setAccessible(true);//替换把高亮字段替换到这个实体对应的属性值上declaredField.set(content, stringListEntry.getValue().get(0));} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}}return content;}).collect(Collectors.toList());}} HighlightBuilder 查询文档 (高亮) 测试结果 高亮字段可以是多个,通过链式调用接着.field(String name); import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param field : 高亮字段 也是 match要查询的字段* param preTags : 高亮前缀* param postTags : 高亮后缀* param text : 查询的值(会分词)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.ListT* explain : 给查询到的值进行高亮* Author Mhh* Date 2021/12/21 15:15*/Testpublic void highlightBuilder() {ListTeacher teacherList elasticsearchSelectController.highlightBuilder(tAddress,font colorred,/font,山东省高新区,Teacher.class);teacherList.forEach(System.err::println);}} 8.19 AggregationBuilders 查询文档 (聚合查询) AggregationBuilders.max(String name).field(String field) : 最大值(max)AggregationBuilders.min(String name).field(String field) : 最小值(min)AggregationBuilders.avg(String name).field(String field) : 平均值(avg)AggregationBuilders.terms(String name).field(String field) : 分组(group by)AggregationBuilders.sum(String name).field(String field) : 总数(sum)… name : 给聚合定义名称 field : 设置用于此聚合的字段。 AggregationBuilders 查询文档 (聚合查询) 测试 相当于MySQL的聚合函数。max、min、avg、sum等termsAggregationBuilder.subAggregation(AggregationBuilder aggregation) : 相当于MySQL的 group by 操作。不要对text类型的数据进行分组会失败。 8.19.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** param name : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param values : 一域多值, 查询的值* return java.util.ListT* explain : 聚合对数据进行分组的求和求数最大值最小值或者其它的自定义的统计功能* // es对聚合有着不错的支持需要注意的是在对某字段进行聚合之后需要开启这个字段的fielddata* // 不要对text类型的数据进行分组,会失败* Author Mhh* Date 2021/12/22 14:29*/PostMapping(aggregationBuilder)public T ListT aggregationBuilder(String name, ClassT classType, String... values) {return elasticsearchSelectService.aggregationBuilder(name, classType, values);}}8.19.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** param name : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param values : 一域多值, 查询的值* return java.util.ListT* explain : 聚合对数据进行分组的求和求数最大值最小值或者其它的自定义的统计功能* // es对聚合有着不错的支持需要注意的是在对某字段进行聚合之后需要开启这个字段的fielddata* // 不要对text类型的数据进行分组,会失败* Author Mhh* Date 2021/12/22 14:29*/public T ListT aggregationBuilder(String name, ClassT classType, String... values);} 8.19.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** param name : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param values : 一域多值, 查询的值* return java.util.ListT* explain : 聚合对数据进行分组的求和求数最大值最小值或者其它的自定义的统计功能* // es对聚合有着不错的支持需要注意的是在对某字段进行聚合之后需要开启这个字段的fielddata* // 不要对text类型的数据进行分组,会失败* Author Mhh* Date 2021/12/22 14:29*/public T ListT aggregationBuilder(String name, ClassT classType, String... values) {//构建termsQueryBuilder(词条查询对应ES query里的terms)不分词查询TermsQueryBuilder termsQueryBuilder QueryBuilders.termsQuery(name, values);//最大值(max)MaxAggregationBuilder maxAggregationBuilder AggregationBuilders.max(maxAge).field(tAge);//最小值(min)MinAggregationBuilder minAggregationBuilder AggregationBuilders.min(minAge).field(tAge);//平均值(avg)AvgAggregationBuilder avgAggregationBuilder AggregationBuilders.avg(avgAge).field(tAge);//分组(group by)TermsAggregationBuilder termsAggregationBuilder AggregationBuilders.terms(termClassName).field(tClassName);//总数(sum)SumAggregationBuilder sumAggregationBuilder AggregationBuilders.sum(sumAge).field(tAge);//创建查询条件构建器SearchSourceBuilder(对应ES外面的大括号)NativeSearchQuery nativeSearchQuery new NativeSearchQueryBuilder().withQuery(termsQueryBuilder).//聚合最大值addAggregation(maxAggregationBuilder).//聚合最小直addAggregation(minAggregationBuilder).//聚合平均值addAggregation(avgAggregationBuilder).//聚合总值addAggregation(sumAggregationBuilder).//分组后聚合 各组的最大值和各组的总和addAggregation(termsAggregationBuilder.subAggregation(maxAggregationBuilder).subAggregation(sumAggregationBuilder)).build();//查询,获取查询结果SearchHitsT search elasticsearchRestTemplate.search(nativeSearchQuery, classType);//获取总记录数long totalHits search.getTotalHits();for (Aggregation aggregation : Objects.requireNonNull(search.getAggregations())) {//查询结果中的总和Sum sum aggregation instanceof Sum ? ((Sum) aggregation) : null;Optional.ofNullable(sum).ifPresent(s - System.err.println(aggregation.getName() : s.getValue()));//查询结果中的最大值Max max aggregation instanceof Max ? ((Max) aggregation) : null;Optional.ofNullable(max).ifPresent(s - System.err.println(aggregation.getName() : s.getValue()));//查询结果中的最小值Min min aggregation instanceof Min ? ((Min) aggregation) : null;Optional.ofNullable(min).ifPresent(s - System.err.println(aggregation.getName() : s.getValue()));//查询结果中的平均值Avg avg aggregation instanceof Avg ? ((Avg) aggregation) : null;Optional.ofNullable(avg).ifPresent(s - System.err.println(aggregation.getName() : s.getValue()));//分组后查询结果Terms terms aggregation instanceof Terms ? (Terms) aggregation : null;Optional.ofNullable(terms).ifPresent(s - System.err.println(aggregation.getName() : s.getBuckets()));}//获取值返回return search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());}} AggregationBuilders 查询文档 (聚合查询) 测试结果 这里获取分组后的值实在有些繁琐为了言简意赅只打印了分组后class地址。 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param name : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param values : 一域多值, 查询的值* return java.util.ListT* explain : 聚合对数据进行分组的求和求数最大值最小值或者其它的自定义的统计功能* // es对聚合有着不错的支持需要注意的是在对某字段进行聚合之后需要开启这个字段的fielddata* // 不要对text类型的数据进行分组,会失败* Author Mhh* Date 2021/12/22 14:29*/Testpublic void aggregationBuilder() {ListTeacher teacherList elasticsearchSelectController.aggregationBuilder(tAddress,Teacher.class,山东省);teacherList.forEach(System.err::println);}} 8.20 SuggestBuilders查询文档 (completionSuggestion—搜索建议补全) SuggestBuilders.completionSuggestion(String fieldname).prefix(String prefix).skipDuplicates(boolean skipDuplicates)… fieldname : 使用fieldName入参进行标题联想(这里就是索引被CompletionField注解标注的字段) prefix : 设置要为其提供补全的前缀。前缀由建议分析器进行分析。 skipDuplicates : 是否应过滤重复项。默认为 { false} SuggestBuilders查询文档 (completionSuggestion—搜索建议补全) 测试 完成补全单词输出如前半部分补全整个单词 8.20.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** 速度快 输入的内容立即返回 对字段类型要求多节省存储空间 时间复杂度O(1)做建议不做纠错* 感觉和prefixQuery 前缀查询 差不多.....* p* 搜索补全必须定义 这个属性(* // CompletionField(analyzer ik_smart, searchAnalyzer ik_smart, maxInputLength 100)* // private Completion completion;)* // 给Completion属性赋值: new Completion(new String[]{山东省泰安市岱岳区}))* // :里面的值就是被自动补全的值** param fieldName : 要用哪个字段进行标题联想(必须是这个CompletionField注解所标注的类型为Completion的字段名)* param text : 被补全的值(比如传的是山东 可能就能给补全为 山东省)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 搜索补全功能 比如在输入框输入(天上)下面就自动补全 (天上人间)(天上边的彩霞)(....)* Author Mhh* Date 2021/12/22 16:51*/PostMapping(completionSuggestion)public ListString completionSuggestion(String fieldName, String text, Class? classType) {return elasticsearchSelectService.completionSuggestion(fieldName, text, classType);}}8.20.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** 速度要快 输入的内容立即返回 对字段类型要求多节省存储空间 时间复杂度O(1)做建议不做纠错* 感觉和prefixQuery 前缀查询 差不多.....* p* 搜索补全必须定义 这个属性(* // CompletionField(analyzer ik_smart, searchAnalyzer ik_smart, maxInputLength 100)* // private Completion completion;)* // 给Completion属性赋值: new Completion(new String[]{山东省泰安市岱岳区}))* // :里面的值就是被自动补全的值** param fieldName : 要用哪个字段进行标题联想(必须是这个CompletionField注解所标注的类型为Completion的字段名)* param text : 被补全的值(比如传的是山东 可能就能给补全为 山东省)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 搜索补全功能 比如在输入框输入(天上)下面就自动补全 (天上人间)(天上边的彩霞)(....)* Author Mhh* Date 2021/12/22 16:51*/public ListString completionSuggestion(String fieldName, String text, Class? classType);} 8.20.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** 速度要快 输入的内容立即返回 对字段类型要求多节省存储空间 时间复杂度O(1)做建议不做纠错* 感觉和prefixQuery 前缀查询 差不多.....* p* 搜索补全必须定义 这个属性(* // CompletionField(analyzer ik_smart, searchAnalyzer ik_smart, maxInputLength 100)* // private Completion completion;)* // 给Completion属性赋值: new Completion(new String[]{山东省泰安市岱岳区}))* // :里面的值就是被自动补全的值** param fieldName : 要用哪个字段进行标题联想(必须是这个CompletionField注解所标注的类型为Completion的字段名)* param text : 被补全的值(比如传的是山东 可能就能给补全为 山东省)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 搜索补全功能 比如在输入框输入(天上)下面就自动补全 (天上人间)(天上边的彩霞)(....)* Author Mhh* Date 2021/12/22 16:51*/public ListString completionSuggestion(String fieldName, String text, Class? classType) {//定义反参容器ListString stringList new ArrayList();//构建搜索建议补全对象CompletionSuggestionBuilder completionSuggestionBuilder SuggestBuilders.completionSuggestion(fieldName). // 使用fieldName入参进行标题联想(这里就是索引被CompletionField注解标注的字段)prefix(text). // 关键字参数传此skipDuplicates(true)// 重复过滤//.size(100) // 匹配数量;//创建搜索提示对象 进行封装搜索补全SuggestBuilder suggestBuilder new SuggestBuilder();// completionSuggestionBuilder:随便起的搜索补全的名字suggestBuilder.addSuggestion(completionSuggestionBuilder, completionSuggestionBuilder);//查询es并反参SearchResponse searchResponse elasticsearchRestTemplate.suggest(suggestBuilder, elasticsearchRestTemplate.getIndexCoordinatesFor(classType));//获取反参中的搜索补全结果Suggest.Suggestion? extends Suggest.Suggestion.Entry? extends Suggest.Suggestion.Entry.Option suggestionBuilder searchResponse.getSuggest().getSuggestion(completionSuggestionBuilder);// 处理返回ListString suggests suggestionBuilder.getEntries().stream().map(x - x.getOptions().stream().map(y - y.getText().toString()).collect(Collectors.toList())).findFirst().get();// 将搜索补全内容保存到容器返回for (String suggest : suggests) {stringList.add(suggest);System.err.println(suggest suggest);}return stringList;}} SuggestBuilders查询文档 (completionSuggestion—搜索建议补全) 测试结果 标题联想必须是被CompletionField注解所标注的类型为Completion对象的属性。定义对象关键词索引 要完成补全搜索必须要用到特殊的数据类型completion。建议补全的值都是在存储时保存在completion里的值。 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** param name : es里索引的域(字段名)* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* param values : 一域多值, 查询的值* return java.util.ListT* explain : 聚合对数据进行分组的求和求数最大值最小值或者其它的自定义的统计功能* // es对聚合有着不错的支持需要注意的是在对某字段进行聚合之后需要开启这个字段的fielddata* // 不要对text类型的数据进行分组,会失败* Author Mhh* Date 2021/12/22 14:29*/Testpublic void aggregationBuilder() {ListTeacher teacherList elasticsearchSelectController.aggregationBuilder(tAddress,Teacher.class,山东省);teacherList.forEach(System.err::println);}} 8.21 SuggestBuilders查询文档 (termSuggestion—纠错补全) SuggestBuilders.termSuggestion(String fieldname).text(String text)… fieldname : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段 text: 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来 SuggestBuilders查询文档 (termSuggestion—纠错补全) 测试 纠错补全输入错误的情况下补全正确的单词 8.21.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** https://www.cnblogs.com/Alexephor/p/11408446.html(Elasticsearch之建议器suggester)写的很详细* 词条建议器term suggester对用户搜索的内容做纠正帮助用户搜索到精确度高的关键字** param fieldName : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段* param text : 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来。* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 词条建议器term suggester主要做纠正 但是是短语就不能做了(Keyword字段)* // 用在查询用户中心查询人名上* // 例如查询 孟浩号 而在字段中是孟浩浩 则就建议返回了 孟浩浩* Author Mhh* Date 2021/12/23 15:40*/PostMapping(termSuggestion)public ListString termSuggestion(String fieldName, String text, Class? classType) {return elasticsearchSelectService.termSuggestion(fieldName, text, classType);}}8.21.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** https://www.cnblogs.com/Alexephor/p/11408446.html(Elasticsearch之建议器suggester)写的很详细* 词条建议器term suggester对用户搜索的内容做纠正帮助用户搜索到精确度高的关键字** param fieldName : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段* param text : 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来。* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 词条建议器term suggester主要做纠正 但是是短语就不能做了(Keyword字段)* // 用在查询用户中心查询人名上* // 例如查询 孟浩号 而在字段中是孟浩浩 则就建议返回了 孟浩浩* Author Mhh* Date 2021/12/23 15:40*/public ListString termSuggestion(String fieldName, String text, Class? classType);} 8.21.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** https://www.cnblogs.com/Alexephor/p/11408446.html(Elasticsearch之建议器suggester)写的很详细* 词条建议器term suggester对用户搜索的内容做纠正帮助用户搜索到精确度高的关键字** param fieldName : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段* param text : 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来。* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 词条建议器term suggester主要做纠正 但是是短语就不能做了(Keyword字段)* // 用在查询用户中心查询人名上* // 例如查询 孟浩号 而在字段中是孟浩浩 则就建议返回了 孟浩浩* Author Mhh* Date 2021/12/23 15:40*/public ListString termSuggestion(String fieldName, String text, Class? classType) {//定义反参容器ListString stringList new ArrayList();
// 构建纠正词条对象 词条建议器(只要是词,短的 比如姓名)TermSuggestionBuilder termSuggestionBuilder SuggestBuilders.termSuggestion(fieldName).text(text);
/* termSuggestionBuilder.suggestMode(TermSuggestionBuilder.SuggestMode.ALWAYS);/*建议模式控制提供建议词的方式1. missing默认方式仅在‘要搜索词项’不在索引中存在时才提供建议词2. popular仅提供频率比‘要搜索词项’高的建议词3. always总是提供建议词*/termSuggestionBuilder.sort(SortBy.SCORE); /*建议词的排序方式1. score先按评分排序再按文档频率、term顺序排2. frequency先按文档频率排序再按评分、term顺序排*///创建搜索提示对象 进行封装词条纠正SuggestBuilder suggestBuilder new SuggestBuilder();// termSuggestionBuilder:随便起的搜索补全的名字(后面会用到)suggestBuilder.addSuggestion(termSuggestionBuilder, termSuggestionBuilder);//查询,获取查询结果SearchResponse searchResponse elasticsearchRestTemplate.suggest(suggestBuilder, IndexCoordinates.of(classType.getAnnotation(Document.class).indexName()));//获取反参中的词条纠正结果Suggest.Suggestion? extends Suggest.Suggestion.Entry? extends Suggest.Suggestion.Entry.Option suggestionBuilder searchResponse.getSuggest().getSuggestion(termSuggestionBuilder);// 处理返回ListString suggests suggestionBuilder.getEntries().stream().map(x - x.getOptions().stream().map(y - y.getText().toString()).collect(Collectors.toList())).findFirst().get();// 将词条纠正内容保存到容器返回for (String suggest : suggests) {stringList.add(suggest);System.err.println(suggest suggest);}return stringList;}} SuggestBuilders查询文档 (termSuggestion—纠错补全) 测试结果 对用户搜索的内容做纠正帮助用户搜索到精确度高的关键字 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** https://www.cnblogs.com/Alexephor/p/11408446.html(Elasticsearch之建议器suggester)写的很详细* 词条建议器term suggester对用户搜索的内容做纠正帮助用户搜索到精确度高的关键字** param fieldName : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段* param text : 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来。* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 词条建议器term suggester主要做纠正 但是是短语就不能做了(Keyword字段)* // 用在查询用户中心查询人名上* // 例如查询 孟浩号 而在字段中是孟浩浩 则就建议返回了 孟浩浩* Author Mhh* Date 2021/12/23 15:40*/Testpublic void termSuggestion() {ListString stringList elasticsearchSelectController.termSuggestion(tName,小黄教授,Teacher.class);stringList.forEach(System.err::println);}} 8.22 SuggestBuilders查询文档 (phraseSuggestion—纠错补全) SuggestBuilders.phraseSuggestion(String fieldname).text(String text)… fieldname : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段 text: 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来 SuggestBuilders查询文档 (termSuggestion—纠错补全) 测试 实在是研究不出它与termSuggestione 有啥区别(后期再补充它)自动纠错补全短语输入一个单词纠错补全整个短语 8.22.1 Controller层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询类*/
RestController
RequestMapping(/elasticSearch/select)
public class ElasticsearchSelectController {Autowiredprivate ElasticsearchSelectService elasticsearchSelectService;/*** https://www.cnblogs.com/Alexephor/p/11408446.html(Elasticsearch之建议器suggester)写的很详细* 词组建议器phraseSuggestion** param fieldName : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段* param text : 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来。* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 词组建议器phraseSuggestion适合较长的字段,但是也不是万能的 做纠正(Keyword字段)* Author Mhh* Date 2021/12/23 15:40*/PostMapping(phraseSuggestion)public ListString phraseSuggestion(String fieldName, String text, Class? classType) {return elasticsearchSelectService.phraseSuggestion(fieldName, text, classType);}}8.22.2 service层 import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.springframework.data.domain.Sort;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述: 查询*/
public interface ElasticsearchSelectService {/*** https://www.cnblogs.com/Alexephor/p/11408446.html(Elasticsearch之建议器suggester)写的很详细* 词组建议器phraseSuggestion** param fieldName : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段* param text : 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来。* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 词组建议器phraseSuggestion适合较长的字段,但是也不是万能的 做纠正(Keyword字段)* Author Mhh* Date 2021/12/23 15:40*/public ListString phraseSuggestion(String fieldName, String text, Class? classType);} 8.22.3 serviceimpl层 import com.it.mhh.elasticsearch.service.ElasticsearchSelectService;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.suggest.*;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder;
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
Service
public class ElasticsearchSelectServiceImp implements ElasticsearchSelectService {Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;/*** https://www.cnblogs.com/Alexephor/p/11408446.html(Elasticsearch之建议器suggester)写的很详细* 词组建议器phraseSuggestion** param fieldName : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段* param text : 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来。* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 词组建议器phraseSuggestion适合较长的字段,但是也不是万能的 做纠正(Keyword字段)* Author Mhh* Date 2021/12/23 15:40*/public ListString phraseSuggestion(String fieldName, String text, Class? classType) {//定义反参容器ListString stringList new ArrayList();
// 构建纠正词组对象PhraseSuggestionBuilder phraseSuggestionBuilder SuggestBuilders.phraseSuggestion(fieldName).text(text);//创建搜索提示对象 进行封装词条纠正SuggestBuilder suggestBuilder new SuggestBuilder();// phraseSuggestionBuilder:随便起的搜索补全的名字(后面会用到)suggestBuilder.addSuggestion(phraseSuggestion, phraseSuggestionBuilder);//查询,获取查询结果SearchResponse searchResponse elasticsearchRestTemplate.suggest(suggestBuilder, IndexCoordinates.of(classType.getAnnotation(Document.class).indexName()));//获取反参中的词条纠正结果Suggest.Suggestion? extends Suggest.Suggestion.Entry? extends Suggest.Suggestion.Entry.Option suggestionBuilder searchResponse.getSuggest().getSuggestion(phraseSuggestion);// 处理 返回ListString suggests suggestionBuilder.getEntries().stream().map(x - x.getOptions().stream().map(y - y.getText().toString()).collect(Collectors.toList())).findFirst().get();// 将词条纠正内容保存到容器返回for (String suggest : suggests) {stringList.add(suggest);System.err.println(suggest suggest);}return stringList;}} SuggestBuilders查询文档 (termSuggestion—纠错补全) 测试结果 适合较长的字段,但是也不是万能的 做纠正 import com.it.mhh.elasticsearch.controller.ElasticsearchSelectController;
import com.it.mhh.elasticsearch.entity.Student;
import com.it.mhh.elasticsearch.entity.Teacher;
import org.elasticsearch.client.indices.AnalyzeResponse;
import org.elasticsearch.index.query.Operator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;/*** 创建人: Mhh* 创建时间: 2021/12/10* 描述:*/
SpringBootTest
RunWith(SpringRunner.class)
public class ElasticsearchSelectControllerTest {Autowiredprivate ElasticsearchSelectController elasticsearchSelectController;//es的查询/*** https://www.cnblogs.com/Alexephor/p/11408446.html(Elasticsearch之建议器suggester)写的很详细* 词组建议器phraseSuggestion** param fieldName : 从fieldName字段中获取候选建议的字段。这是一个必需的选项需要全局设置或根据建议设置。Keyword字段* param text : 建议文本建议文本是必需的选项可以通过全局多个建议器中查询相同的内容或者按照单个建议器的格式来。* param classType : 返回的list里的对象并且通过对象里面Document注解indexName属性获取查询哪个索引* return java.util.Listjava.lang.String* explain : 词组建议器phraseSuggestion适合较长的字段,但是也不是万能的 做纠正(Keyword字段)* Author Mhh* Date 2021/12/23 15:40*/Testpublic void phraseSuggestion() {ListString stringList elasticsearchSelectController.phraseSuggestion(tFamous,吾之初心永世不完,Teacher.class);stringList.forEach(System.err::println);}}