pom配置
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.8.0</version>
</dependency>
<!-- elasticsearch 的客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.0</version>
</dependency>
<!-- elasticsearch 依赖 2.x 的 log4j -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<!-- junit 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
客户端对象
public static void main(String[] args) throws IOException {
// 创建客户端对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
);
// 关闭客户端连接
client.close();
}
索引操作
// 创建索引
public static void createIndex(RestHighLevelClient client) throws IOException {
// 创建索引 - 请求对象
CreateIndexRequest request = new CreateIndexRequest("user");
// 发送请求,获取响应
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
// 响应状态
System.out.println("操作状态 = " + acknowledged);
}
// 查看索引
public static void getIndex(RestHighLevelClient client) throws IOException {
// 查询索引 - 请求对象
GetIndexRequest request = new GetIndexRequest("user");
// 发送请求,获取响应
GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
System.out.println("aliases: " + response.getAliases());
System.out.println("mappings: " + response.getMappings());
System.out.println("settings: " + response.getSettings());
}
// 删除索引
public static void deleteIndex(RestHighLevelClient client) throws IOException {
// 删除索引 - 请求对象
DeleteIndexRequest request = new DeleteIndexRequest("user");
// 发送请求,获取响应
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
// 操作结果
System.out.println("操作结果: " + response.isAcknowledged());
}
文档操作
// 创建文档
public static void createDoc(RestHighLevelClient client) throws IOException {
// 新增文档 - 请求对象
IndexRequest request = new IndexRequest();
// 设置索引及唯一性标识
request.index("user").id("1001");
// 创建数据对象
User user = new User();
user.setAge(26);
user.setSex("男");
user.setName("jak");
ObjectMapper objectMapper = new ObjectMapper();
String productJson = objectMapper.writeValueAsString(user);
// 添加文档数据, 数据格式为Json格式
request.source(productJson, XContentType.JSON);
// 客户端发送请求,获取响应对象
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("_index: " + response.getIndex());
System.out.println("id: " + response.getId());
System.out.println("_result: " + response.getResult());
}
// 修改文档
public static void updateDoc(RestHighLevelClient client) throws IOException {
// 修改文档 - 请求对象
UpdateRequest request = new UpdateRequest();
// 配置修改参数
request.index("user").id("1001");
// 设置请求体,对数据进行修改
request.doc(XContentType.JSON, "sex", "女");
// 客户端发送请求,获取响应对象
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("_index: " + response.getIndex());
System.out.println("_id: " + response.getId());
System.out.println("_result: " + response.getResult());
}
// 查询文档
public static void getDoc(RestHighLevelClient client) throws IOException {
// 创建请求对象
GetRequest request = new GetRequest().index("user").id("1001");
// 客户端发送请求,获取响应对象
GetResponse response = client.get(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("_index: " + response.getIndex());
System.out.println("_type: " + response.getType());
System.out.println("_id: " + response.getId());
System.out.println("source: " + response.getSourceAsString());
}
// 删除文档
public static void deleteDoc(RestHighLevelClient client) throws IOException {
// 创建请求对象
DeleteRequest request = new DeleteRequest().index("user").id("1");
// 客户端发送请求,获取响应对象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
// 打印信息
System.out.println(response.toString());
}
// 批量新增
public static void bulkCreateDoc(RestHighLevelClient client) throws IOException {
// 创建批量新增请求对象
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan"));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi"));
request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu"));
// 客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("took: " + responses.getTook());
System.out.println("items: " + Arrays.toString(responses.getItems()));
}
// 批量删除
public static void bulkDeleteDoc(RestHighLevelClient client) throws IOException {
// 创建批量删除请求对象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("user").id("1001"));
request.add(new DeleteRequest().index("user").id("1002"));
request.add(new DeleteRequest().index("user").id("1003"));
// 客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("took: " + responses.getTook());
System.out.println("items: " + Arrays.toString(responses.getItems()));
}
Java代码实现DSL语句
检索的条件对象: 实体类
检索的请求信息url.参数等,controller
检索类型:
关键字检索
索引检索
构建实体与es mapping映射关系
定义:搜索页面中的展示数据
Goods.java实体类
package com.doyens.gmall.model.list;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.Date;
import java.util.List;
// Index = goods , Type = info
@Data
@Document(indexName = "goods" ,type = "info",shards = 3,replicas = 2)
public class Goods {
// 商品Id
@Id
private Long id;
@Field(type = FieldType.Keyword, index = false)
private String defaultImg;
// es 中能分词的字段,这个字段数据类型必须是 text!keyword 不分词!
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Double)
private Double price;
@Field(type = FieldType.Date)
private Date createTime; // 新品
@Field(type = FieldType.Long)
private Long tmId;
@Field(type = FieldType.Keyword)
private String tmName;
@Field(type = FieldType.Keyword)
private String tmLogoUrl;
@Field(type = FieldType.Long)
private Long category1Id;
@Field(type = FieldType.Keyword)
private String category1Name;
@Field(type = FieldType.Long)
private Long category2Id;
@Field(type = FieldType.Keyword)
private String category2Name;
@Field(type = FieldType.Long)
private Long category3Id;
@Field(type = FieldType.Keyword)
private String category3Name;
// 商品的热度!
@Field(type = FieldType.Long)
private Long hotScore = 0L;
// 平台属性集合对象
// Nested 支持嵌套查询
@Field(type = FieldType.Nested)
private List<SearchAttr> attrs;
}
说明:
@Document(indexName = "goods" ,type = "info",shards = 3,replicas = 2)
// 库 表 分片 副本
shards分片:意思是我们的es库,一台服务器放不下,分几台服务器进行存储
replicas副本:备份;分片的数据可能出现问题,需要备份应对意外情况
常用操作
GET /索引库名/_search
查看数据库信息GET /索引库名/_mapping
查看数据的映射关系,对应Java实体类中的字段
使用
- 引入依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> </dependencies>
- 配置application.yml
spring: cloud: sentinel: transport: dashboard: 192.168.200.128:8858 zipkin: base-url: http://192.168.200.128:9411 discovery-client-enabled: false sender: type: web sleuth: sampler: probability: 1 # ElasticSearch相关配置 elasticsearch: rest: uris: http://192.168.200.128:9200
- 编写mapping对应实体类
import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; import java.util.Date; import java.util.List; // Index = goods , Type = info @Data @Document(indexName = "goods" ,type = "info",shards = 3,replicas = 2) public class Goods { // 商品Id @Id private Long id; @Field(type = FieldType.Keyword, index = false) private String defaultImg; // es 中能分词的字段,这个字段数据类型必须是 text!keyword 不分词! @Field(type = FieldType.Text, analyzer = "ik_max_word") private String title; @Field(type = FieldType.Double) private Double price; @Field(type = FieldType.Date) private Date createTime; // 新品 @Field(type = FieldType.Long) private Long tmId; @Field(type = FieldType.Keyword) private String tmName; @Field(type = FieldType.Keyword) private String tmLogoUrl; @Field(type = FieldType.Long) private Long category1Id; @Field(type = FieldType.Keyword) private String category1Name; @Field(type = FieldType.Long) private Long category2Id; @Field(type = FieldType.Keyword) private String category2Name; @Field(type = FieldType.Long) private Long category3Id; @Field(type = FieldType.Keyword) private String category3Name; // 商品的热度! @Field(type = FieldType.Long) private Long hotScore = 0L; // 平台属性集合对象 // Nested 支持嵌套查询 @Field(type = FieldType.Nested) private List<SearchAttr> attrs; }
- 创建索引库
import com.doyens.gmall.common.result.Result; import com.doyens.gmall.model.list.Goods; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/list") public class ListApiController { //引入es客户端 @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; @GetMapping("inner/createIndex") public Result createIndex(){ // 创建索引库 elasticsearchRestTemplate.createIndex(Goods.class); // mapping映射 elasticsearchRestTemplate.putMapping(Goods.class); return Result.ok(); } }
- 往索引库存入内容
关注方向: - 分词:
- 作用: 把查询的内容(分词),当作索引进行使用,可以加快查询使用
- 技术: IK分词器,把新华字典
里有的词作为一个词;自定义分词:手动录入,es中有个dic文件,将新增的分词录入到这个文件,es会自动进行加载
- 例如:商品名称 - 哪些字段进行过滤
平台属性值
分类Id - 哪些字段我们需要通过搜索查询出来。
商品名称,价格,图片等。 - 搜索
数据的上架与下架
上架: 将对应的数据放到es索引库中
下架: 从es索引库中删除对应数据
上架和下架, 操作的数据库不是mysql数据库
现在操作的是 es索引库.
实现流程:pojo—> repository —> service —>controller
ElasticsearchRepository接口
ElasticsearchRepository类似于MybatisPlus的BaseMapper
继承ElasticsearchRepository后,索引库的单表操作不需要手动实现
import com.doyens.gmall.model.list.Goods;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
@Repository
// Goods为对应的实体类,Long为主键类型
public interface GoodsRepository extends ElasticsearchRepository<Goods,Long> {
}
文档操作
public class EsDoc {
public static void main(String[] args) throws IOException {
// 创建客户端对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
);
// 关闭客户端连接
client.close();
}
// 创建文档
public static void createDoc(RestHighLevelClient client) throws IOException {
// 新增文档 - 请求对象
IndexRequest request = new IndexRequest();
// 设置索引及唯一性标识
request.index("user").id("1001");
// 创建数据对象
User user = new User();
user.setAge(26);
user.setSex("男");
user.setName("jak");
ObjectMapper objectMapper = new ObjectMapper();
String productJson = objectMapper.writeValueAsString(user);
// 添加文档数据, 数据格式为Json格式
request.source(productJson, XContentType.JSON);
// 客户端发送请求,获取响应对象
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("_index: " + response.getIndex());
System.out.println("id: " + response.getId());
System.out.println("_result: " + response.getResult());
}
// 修改文档
public static void updateDoc(RestHighLevelClient client) throws IOException {
// 修改文档 - 请求对象
UpdateRequest request = new UpdateRequest();
// 配置修改参数
request.index("user").id("1001");
// 设置请求体,对数据进行修改
request.doc(XContentType.JSON, "sex", "女");
// 客户端发送请求,获取响应对象
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("_index: " + response.getIndex());
System.out.println("_id: " + response.getId());
System.out.println("_result: " + response.getResult());
}
// 查询文档
public static void getDoc(RestHighLevelClient client) throws IOException {
// 创建请求对象
GetRequest request = new GetRequest().index("user").id("1001");
// 客户端发送请求,获取响应对象
GetResponse response = client.get(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("_index: " + response.getIndex());
System.out.println("_type: " + response.getType());
System.out.println("_id: " + response.getId());
System.out.println("source: " + response.getSourceAsString());
}
// 删除文档
public static void deleteDoc(RestHighLevelClient client) throws IOException {
// 创建请求对象
DeleteRequest request = new DeleteRequest().index("user").id("1");
// 客户端发送请求,获取响应对象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
// 打印信息
System.out.println(response.toString());
}
// 批量新增
public static void bulkCreateDoc(RestHighLevelClient client) throws IOException {
// 创建批量新增请求对象
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan"));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi"));
request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu"));
// 客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("took: " + responses.getTook());
System.out.println("items: " + Arrays.toString(responses.getItems()));
}
// 批量删除
public static void bulkDeleteDoc(RestHighLevelClient client) throws IOException {
// 创建批量删除请求对象
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("user").id("1001"));
request.add(new DeleteRequest().index("user").id("1002"));
request.add(new DeleteRequest().index("user").id("1003"));
// 客户端发送请求,获取响应对象
BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);
// 打印结果信息
System.out.println("took: " + responses.getTook());
System.out.println("items: " + Arrays.toString(responses.getItems()));
}
}
高级查询
public class EsSearch {
public static void main(String[] args) throws IOException {
// 创建客户端对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http"))
);
// 关闭客户端连接
client.close();
}
// 查询所有索引数据
public static void matchAllQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// term查询,查询条件为关键字
public static void termQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.termQuery("age", "30"));
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// 分页查询
public static void pageQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 分页查询
// 当前页起始索引(第一条数据的顺序号),from
sourceBuilder.from(0);
// 每页显示多少条size
sourceBuilder.size(2);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// 数据排序
public static void sortOrderQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 排序
sourceBuilder.sort("age", SortOrder.ASC);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// 过滤字段
public static void filterFieldsQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 查询字段过滤
String[] excludes = {};
String[] includes = {"name", "age"};
sourceBuilder.fetchSource(includes, excludes);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// Bool查询
public static void boolQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 必须包含
boolQueryBuilder.must(QueryBuilders.matchQuery("age", "30"));
// 一定不含
boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name", "zhangsan"));
// 可能包含
boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男"));
// 查询所有数据
sourceBuilder.query(boolQueryBuilder);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// 范围查询
public static void rangeQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
// 大于等于
rangeQuery.gte("30");
// 小于等于
rangeQuery.lte("40");
// 查询所有数据
sourceBuilder.query(rangeQuery);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// 范围查询
public static void fuzzyQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询所有数据
sourceBuilder.query(QueryBuilders.fuzzyQuery("name", "zhangsan").fuzziness(Fuzziness.ONE));
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// 高亮查询
public static void highLightQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构建查询方式: 高亮查询
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "zhangsan");
// 设置查询方式
sourceBuilder.query(termsQueryBuilder);
// 构建高亮字段
HighlightBuilder highlightBuilder = new HighlightBuilder();
// 设置标签前缀
highlightBuilder.preTags("<font color='red'>");
// 设置标签后缀
highlightBuilder.postTags("</font>");
// 设置高亮字段
highlightBuilder.field("name");
// 设置高亮构建对象
sourceBuilder.highlighter(highlightBuilder);
// 设置请求体
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// 聚合查询
public static void AggrQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));
// 设置请求体
request.source(sourceBuilder);
// 客户端发送请求,获取响应对象
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
// 分组统计
public static void groupQuery(RestHighLevelClient client) throws IOException {
// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("student");
// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(AggregationBuilders.terms("age_group_by").field("age"));
// 设置请求体
request.source(sourceBuilder);
// 客户端发送请求,获取响应对象
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 查询匹配
SearchHits hits = response.getHits();
System.out.println("took: " + response.getTook());
System.out.println("timeout: " + response.isTimedOut());
System.out.println("total: " + hits.getTotalHits());
System.out.println("MaxScore: " + hits.getMaxScore());
System.out.println("hits------------->");
for (SearchHit hit : hits) {
// 输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
}
System.out.println("<-----------------");
}
}
模糊查询
查询batch_number不以_history
结尾的数据
.mustNot(QueryBuilders.wildcardQuery("batch_number", "*_history"))//批次号非历史