Elasticsearch概述和DSL查询总结
一、Elasticsearch概述
1. 什么是Elasticsearch
Elasticsearch是基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用java开发的,开源,是当前流行的企业级搜索引擎。
2. 作用
Elasticsearch具有极快的搜索速度,可以在几乎实时的时间内对大规模数据进行搜索和查询;它利用倒排索引和分布式搜索技术,使搜索操作变得高效,并能够多种查询方式进行全文搜索、短语匹配、模糊搜索等。
3. 特点
能够实时搜索,稳定,可靠,快速并且安装使用方便。
分布式和可扩展性:Elasticsearch基于分布式架构,可以将数据分布在多台服务器上,实现数据的水平分片和复制。这使得它能够处理海量数据,并具有高可用性和容错能力。通过添加或删除节点,可以轻松地扩展集群的容量和性能。

概念和作用
DSL查询是一种基于JSON的查询语言,用于构建复杂的查询和过滤条件,以检索和过滤文档。DSL查询提供了丰富的查询语法和灵活的组合方式,可以根据用户需求构建定制化的查询逻辑。
查询代码总结
重复代码:
@Autowired //注入客户端
RestHighLevelClient client;
SearchRequest searchRequest = new SearchRequest("abc"); //参数为索引名
searchRequest.types("doc"); //参数为类型
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //创建查找源构造器
SearchResponse searchResponse = client.search(searchRequest);
一、分页查询
//分页查询,设置起始下标,从0开始
searchSourceBuilder.from(0); //工作中可以套公式计算出起始值(page-1)*size
//每页显示个数
searchSourceBuilder.size(10);
二、Term精准查询
searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));
三、根据id精准匹配
searchSourceBuilder.query(QueryBuilders.termsQuery("_id", idList));
四、match全文检索
先将搜索字符串分词,再使用各个词条从索引中搜索。
searchSourceBuilder.query(
QueryBuilders.matchQuery("description", "spring开发")
.operator(Operator.OR));
五、multi一次匹配多个字段
单项匹配是在一个field中去匹配,多项匹配是拿关键字去多个Field中匹配。
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring框架", "name", "description") .minimumShouldMatch("50%");
multiMatchQueryBuilder.field("name",10);//提升boost显示级别
六、布尔查询
must:文档必须匹配must所包括的查询条件,相当于 “AND”。 表示必须,多个查询条件必须都满足。
should:文档应该匹配should所包括的查询条件其中的一个或多个,相当于 "OR" 。表示或者,多个查询条件只要有一个满足即可。
must_not:文档不能匹配must_not所包括的该查询条件,相当于 “NOT”。表示非。
boolQueryBuilder.must(multiMatchQueryBuilder);
七、filter过滤器
boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel", "201001"));
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(60).lte(100));
八、sort排序
searchSourceBuilder.sort(new FieldSortBuilder("price").order(SortOrder.ASC));
九、高亮显示
//高亮设置
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<tag>");//设置前缀
highlightBuilder.postTags("</tag>");//设置后缀
// 设置高亮字段
highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
//取出高亮字段内容
HighlightField nameField = highlightFields.get("name");
Text[] fragments = nameField.getFragments();