elasticsearch高级查询api
创始人
2025-05-28 09:14:42

yml配置

  #es配置
spring:elasticsearch:rest:uris: 192.168.16.188:9200

添加依赖

org.elasticsearch.clientelasticsearch-rest-high-level-client

使用编程的形式设置连接的ES服务器,并获取客户端对象,配置ES服务器地址与端口9200,记得客户端使用完毕需要手工关闭。由于当前客户端是手工维护的,因此不能通过自动装配的形式加载对象

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootTest.class)
public class JeecgTest {@Test
//    @SneakyThrowspublic void name() {HttpHost host = HttpHost.create("http://localhost:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);try {client.close();} catch (IOException e) {throw new RuntimeException(e);}}
}

使用客户端对象操作ES,例如创建索引

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootTest.class)
public class JeecgTest {private RestHighLevelClient client;@Testvoid testCreateIndex() throws IOException {HttpHost host = HttpHost.create("http://localhost:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);CreateIndexRequest request = new CreateIndexRequest("books");client.indices().create(request, RequestOptions.DEFAULT); client.close();}
}

添加文档,添加文档使用的请求对象是IndexRequest,与创建索引使用的请求对象不同

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootTest.class)
public class JeecgTest {@Testpublic void testCreateIndex() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);HashMap map = new HashMap<>();map.put("name", "张三");map.put("age", 20);IndexRequest request = new IndexRequest("user");String json = JSON.toJSONString(map);request.source(json, XContentType.JSON);IndexResponse index = client.index(request, RequestOptions.DEFAULT);client.close();}
}

/增量更新文档

  @Testpublic void testUpdateDoc() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);UpdateRequest updateRequest = new UpdateRequest("user", "88");updateRequest.timeout("1s");User user = new User();user.setAge(222);updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);client.close();}

批量添加文档:批量做时,先创建一个BulkRequest的对象,可以将该对象理解为是一个保存request对象的容器,将所有的请求都初始化好后,添加到BulkRequest对象中,再使用BulkRequest对象的bulk方法,一次性执行完毕

    @Test//批量添加文档public void testCreateDocAll() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);List list = new ArrayList<>();HashMap map = new HashMap<>();for (int i = 0; i < 3; i++) {map.put("aa" + i, i);list.add(map);}BulkRequest bulk = new BulkRequest();for (Map map1 : list) {IndexRequest request = new IndexRequest("user");String json = JSON.toJSONString(map1);request.source(json, XContentType.JSON);bulk.add(request);}client.bulk(bulk, RequestOptions.DEFAULT);client.close();}

按id查询1文档:根据id查询文档使用的请求对象是GetRequest

    @Test//按id查询public void getById() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);GetRequest request = new GetRequest("user", "88");GetResponse response = client.get(request, RequestOptions.DEFAULT);String json = response.getSourceAsString();System.out.println(json);client.close();}

通过id查询2

    @Test//按id查询public void getById2() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.termQuery("_id",88));request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String source = hit.getSourceAsString();System.out.println(source);}client.close();}

按条件查询文档:按条件查询文档使用的请求对象是SearchRequest,查询时调用SearchRequest对象的termQuery方法,需要给出查询属性名,此处支持使用合并字段,也就是前面定义索引属性时添加的all属性

    @Test//按条件查询public void getBySearch() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchPhraseQuery("name","张三"));request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String source = hit.getSourceAsString();System.out.println(source);}client.close();}

按条件高亮查询

    @Test//按条件高亮查询public void getBySearch2() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchPhraseQuery("name","张三"));HighlightBuilder highlightBuilder = new HighlightBuilder();searchSourceBuilder.highlighter(highlightBuilder.field("name"));request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {Map highlightFields = hit.getHighlightFields();System.out.println(highlightFields);}client.close();}

分页查询

    @Test//分页查询public void getBySearch3() throws IOException {// 开始查询的记录数//页码Integer pageNum=1;//页数Integer pageSize=2;int start = (pageNum - 1) * pageSize;HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchAllQuery());searchSourceBuilder.from(start);searchSourceBuilder.size(pageSize);request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();System.out.println(sourceAsString);}client.close();}

MultiQuery 全部字段联合搜索

    @Test// MultiQuery 全部字段联合搜索 public void getBySearch4() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.multiMatchQuery("三"));request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String source = hit.getSourceAsString();System.out.println(source);}client.close();}

MultiQuery 多字段联合搜索 ,使用多字段查询的时候,查询的字段要和查询的内容类型一直,不然就会报错,类似age字段是int类型,和name字段是string类型查询就会报错

    @Test// MultiQuery 多字段联合搜索public void getBySearch5() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.multiMatchQuery("王","name","file"));request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String source = hit.getSourceAsString();System.out.println(source);}client.close();}

多域联合查询的时候,可以通过 boost 来设置某个域在计算得分时候的比重,比重越高的域当他符合条件时计算的得分越高,相应的该记录也更靠前。通过在 fields 中给相应的字段用 ^权重倍数来实现

	@Test// MultiQuery 多字段联合搜索和设置权重public void getBySearch6() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.multiMatchQuery("广","name","address").field("name",10));request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String source = hit.getSourceAsString();System.out.println(source);}client.close();}

如果我们既要对一些字段进行分词查询,同时要对另一些字段进行精确查询,就需要使用布尔查询来实现了。布尔查询对应于Lucene的BooleanQuery查询,实现将多个查询组合起来,有三个可选的参数:must:文档必须匹配must所包括的查询条件,相当于 “AND”should:文档应该匹配should所包括的查询条件其中的一个或多个,相当于 "OR"must_not:文档不能匹配must_not所包括的该查询条件,相当于“NOT”

```erlang
GET user/_search
{"query": {"bool": { // 布尔查询"must": [ // 查询条件 must 表示数组中的查询方式所规定的条件都必须满足{"multi_match": {"query": "王小妹","minimum_should_match": "50%","fields": ["name^10","title"]}},{"match": {"address": "广州"}}]}}
}
    @Test// 布尔查询 BoolQuerypublic void getBySearch7() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 搜索方式// 首先构造多关键字查询条件MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("王小妹", "name", "title").field("name", 10);// 然后构造匹配查询条件MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "广州");// 组合两个条件,组合方式为 must 全满足BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(multiMatchQueryBuilder);boolQueryBuilder.must(matchQueryBuilder);// 将查询条件封装给查询对象searchSourceBuilder.query(boolQueryBuilder);request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String source = hit.getSourceAsString();System.out.println(source);}client.close();}

定义过滤器查询,是在原本查询结果的基础上对数据进行筛选,因此省略了重新计算的分的步骤,效率更高。并且方便缓存。推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用,过滤器在布尔查询中使用,下边是在搜索结果的基础上进行过滤:

GET user/_search
{"query": {"bool": {"must": [{"multi_match": {"query": "王小妹","minimum_should_match": "50%","fields": ["name^10","title"]}}],"filter": [{// 过滤条件:studymodel 必须是 201001"match": {"address": "广州"}},{// 过滤条件:年龄 >=10 <=100"range": {"age": {"gte": 10,"lte": 100}}}]}}
}
    @Test// 过滤器public void getBySearch8() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 搜索方式// 首先构造多关键字查询条件MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("王小妹", "name", "title").field("name", 10);// 构造匹配查询条件MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "广州");// 构造范围查询条件RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gt(10).lt(100);BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(multiMatchQueryBuilder);boolQueryBuilder.filter(matchQueryBuilder);boolQueryBuilder.filter(rangeQueryBuilder);// 将查询条件封装给查询对象searchSourceBuilder.query(boolQueryBuilder);request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String source = hit.getSourceAsString();System.out.println(source);}client.close();}

注意:range和term一次只能对一个Field设置范围过虑

排序,在查询的结果上进行二次排序,支持对 keyword、date、float 等类型添加排序,text类型的字段不允许排序

GET user/_search
{"query": {"bool": {"filter": [{"range": {"age": {"gte": 10,"lte": 100}}}]}},"sort": [{"age": "desc" }]
}
    @Test// 排序public void getBySearch9() throws IOException {HttpHost host = HttpHost.create("http://192.168.16.188:9200");RestClientBuilder builder = RestClient.builder(host);client = new RestHighLevelClient(builder);SearchRequest request = new SearchRequest("user");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 构造范围查询条件RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gt(10).lt(100);BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.filter(rangeQueryBuilder);searchSourceBuilder.sort("age", SortOrder.DESC);// 将查询条件封装给查询对象searchSourceBuilder.query(boolQueryBuilder);request.source(searchSourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String source = hit.getSourceAsString();System.out.println(source);}client.close();}

相关内容

热门资讯

情义无价原唱是谁 ,《情义无价... 情义无价原唱是谁 目录情义无价原唱是谁 《情义无价》原唱情义无价 是谁唱的?情义无价主题歌曲原唱情义...
yp是什么意思 ,上海话“yp... yp是什么意思 目录yp是什么意思 上海话“yp”是什么意思?车牌号前两位是yp是什么意思?奶粉国食...
历史进程是什么意思 ,历史过程... 历史进程是什么意思 目录历史进程是什么意思 历史过程和历史进程的区别科学家希望能够重现这一历史进程中...
风决定要走云怎么挽留是什么歌 ... 风决定要走云怎么挽留是什么歌 目录风决定要走云怎么挽留是什么歌 风决定要走云怎么挽留是什么歌,什么歌...
跨境老兵多年经验整理出的Wha... 龙哥发现很多新人都是一注册好WhatsApp就开始努力工作、努力营销,但是其实这是不可...
[C++]反向迭代器 目录 前言: 1 对反向迭代器的构造思想 2 实现反向迭代器 3 完整代码 前言&#x...
酒圣分别是谁 ,酒圣是指谁? ... 酒圣分别是谁 目录酒圣分别是谁 酒圣是指谁?中国圣人酒圣指的是谁医圣、武圣、画圣、酒圣、茶圣分别是谁...
GDB调试程序 1.GDB 调试程序 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。在UNIX平台...
电视剧于无声处剧情介绍,门卫老... 电视剧于无声处剧情介绍目录电视剧于无声处剧情介绍门卫老齐头是什么剧的人物?
心愿卡怎么做 ,教师节心愿卡制... 心愿卡怎么做 目录心愿卡怎么做 教师节心愿卡制作做贺卡(心愿卡)该怎么做才漂亮啊!怎样制作心愿卡心愿...
亲爱的热爱的里小艾是谁演的 ,... 亲爱的热爱的里小艾是谁演的 目录亲爱的热爱的里小艾是谁演的 你认识小艾吗亲爱的、热爱的演员表亲爱的热...
霸气十足的近义词是什么 ,霸气... 霸气十足的近义词是什么 目录霸气十足的近义词是什么 霸气十足的近义词是什么?什么什么十足的成语霸气十...
经营类别是指什么 ,药品批发经... 经营类别是指什么 目录经营类别是指什么 药品批发经营类别是指什么增值税经营类别未分类 怎么分类企业经...
樱花动漫为什么没有莉可丽丝 ,... 樱花动漫为什么没有莉可丽丝 目录莉可丽丝漫画在哪里看樱花庄的宠物女孩为什么不出第二季莉可丽丝为什么烂...
什么是管理幅度 ,管理宽度指的... 什么是管理幅度 目录什么是管理幅度 管理宽度指的是什么?什么是管理幅度?什么是管理幅度?什么是管理幅...
预约有礼 | 迅镭激光与您相约...   3月29日-4月1日,国内机床工业领域第一场超大型专业展会——2023ITES深圳...
js正则:input 输入限制 这里写自定义目录标题正则:input 输入限制(IP和数值类型规则限制输...
再学C语言45:字符串输入 若需把一个字符串读到程序中,首先预留存储字符串的空间,然后使用输入函数获...
春联上联是一二声还是三四声 ,... 春联上联是一二声还是三四声 目录春联上联是一二声还是三四声 春联的帖法 有说三四声在左 ,有的说一二...
212事件是什么 ,212事件... 212事件是什么 目录我想问一下212事件什么梗212事件是什么QQ空间212事件是什么?腾讯回应"...
白清灵端王妃小说叫什么名字,女... 白清灵端王妃小说叫什么名字目录白清灵端王妃小说叫什么名字女军医穿越当王妃的叫白清灵的?莫凛程忆这本书...
有关军二代的小说介绍几个啊,求... 有关军二代的小说介绍几个啊目录有关军二代的小说介绍几个啊求男主是军二代或者是男主重生成军二代的小说,...
JVM参数的分类及常用参数 常用JVM参数 JVM参数可以分为三种类型,分别是以-、-X、-XX开头的参数 -开头的参数比较稳定...
Revit中屋面瓦填充图案问题...   一、Revit中屋面瓦填充图案无法随图案着屋面坡度方向的改变而改变   Revit中࿰...
求一本邪恶类的小说都市的,有什... 求一本邪恶类的小说都市的目录找个都市系统流小说,主角奇遇获得系统,要做任务,任务都很邪恶很变态的。有...
宫锁珠帘结局 ,《宫锁珠帘》结... 宫锁珠帘结局 目录宫锁珠帘结局 《宫锁珠帘》结局是什么?宫锁珠帘结局是什么宫锁珠帘结局如何 结局怜儿...
叶良辰是什么梗,一夜爆红网络,... 叶良辰是什么梗目录叶良辰是什么梗一夜爆红网络,叶良辰是个什么梗叶良辰是什么梗?叶良辰是什么梗?叶良辰...
dnf爆裂的信徒什么难度出 ,... dnf爆裂的信徒什么难度出 目录dnf爆裂的信徒什么难度出 DNF爆裂的信徒套装问题跪求DNF70及...
Stable Diffusio... Stable Diffusion 是一种尖端的开源工具,用于从文本生成图像。 Stab...
Crypto、Cython、p... 1、Crypto可用于加密密码生成许可证,但不能直接pip安装,常见问题...