当前位置: 首页 > news >正文

es的nested查询

一、一层嵌套
mapping:

PUT /nested_example
{"mappings": {"properties": {"name": {"type": "text"},"books": {"type": "nested","properties": {"title": {"type": "text"},"author": {"type": "text"}}}}}
}

导入数据到索引:


POST /nested_example/_bulk
{ "index" : { "_id" : "1" } }
{ "name" : "John Doe", "books" : [ { "title" : "Book 1", "author" : "Author 1" }, { "title" : "Book 2", "author" : "Author 2" } ] }
{ "index" : { "_id" : "2" } }
{ "name" : "Jane Smith", "books" : [ { "title" : "Book 3", "author" : "Author 3" }, { "title" : "Book 4", "author" : "Author 4" } ] }

使用DevTools执行多层嵌套查询

 POST /nested_example/_search
{"query": {"bool": {"must": [{"match": {"name": "Tom"}},{"nested": {"path": "books","query": {"match": {"books.author": "Jerry"}}}}]}}
}

Java查询语句:

 import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.NestedQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;public class ElasticsearchNestedQueryExample {public static void main(String[] args) throws Exception {RestHighLevelClient client = new RestHighLevelClient();SearchRequest searchRequest = new SearchRequest("nested_example");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 构建bool查询BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 添加must子句用于匹配name字段为"Tom"MatchQueryBuilder nameQuery = QueryBuilders.matchQuery("name", "Tom");boolQuery.must(nameQuery);// 构建嵌套查询NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery("books",QueryBuilders.matchQuery("books.author", "Jerry"),ScoreMode.None // 可选的分数模式);boolQuery.must(nestedQuery);sourceBuilder.query(boolQuery);searchRequest.source(sourceBuilder);// 执行查询client.search(searchRequest, RequestOptions.DEFAULT);// 关闭客户端连接client.close();}
}

二、多层嵌套
mapping:

PUT /nested_example
{"mappings": {"properties": {"name": {"type": "text"},"books": {"type": "nested","properties": {"title": {"type": "text"},"authors": {"type": "nested","properties": {"author_name": {"type": "text"}}}}}}}
}

导入数据到索引

POST /nested_example/_bulk
{ "index" : { "_id" : "1" } }
{ "name" : "John Doe", "books" : [ { "title" : "Book 1", "authors" : [ { "author_name" : "Author 1" }, { "author_name" : "Author 2" } ] } ] }
{ "index" : { "_id" : "2" } }
{ "name" : "Jane Smith", "books" : [ { "title" : "Book 2", "authors" : [ { "author_name" : "Author 2" }, { "author_name" : "Author 3" } ] } ] }

使用DevTools执行多层嵌套查询

POST /nested_example/_search
{"query": {"bool": {"must": [{"match": {"name": "Tom"}},{"nested": {"path": "books","query": {"nested": {"path": "books.authors","query": {"match": {"books.authors.author_name": "Author 2"}}}}}}]}}
}

Java查询语句:

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.NestedQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;public class ElasticsearchNestedNestedQueryExample {public static void main(String[] args) throws Exception {RestHighLevelClient client = new RestHighLevelClient();SearchRequest searchRequest = new SearchRequest("nested_example");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 构建bool查询BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 添加must子句用于匹配name字段为"Tom"MatchQueryBuilder nameQuery = QueryBuilders.matchQuery("name", "Tom");boolQuery.must(nameQuery);// 构建外层nested查询NestedQueryBuilder outerNestedQuery = QueryBuilders.nestedQuery("books",// 构建内层nested查询QueryBuilders.nestedQuery("books.authors",QueryBuilders.matchQuery("books.authors.author_name", "Author 2"),ScoreMode.None // 可选的分数模式),ScoreMode.None // 可选的分数模式);boolQuery.must(outerNestedQuery);sourceBuilder.query(boolQuery);searchRequest.source(sourceBuilder);// 执行查询client.search(searchRequest, RequestOptions.DEFAULT);// 关闭客户端连接client.close();}
}
http://www.lryc.cn/news/182643.html

相关文章:

  • <一>Qt斗地主游戏开发:开发环境搭建--VS2019+Qt5.15.2
  • python:进度条的使用(tqdm)
  • Java类型转换和类型提升
  • C# 读取 Excel xlsx 文件,显示在 DataGridView 中
  • Docker02基本管理
  • Scala第十章
  • 10.4 校招 实习 内推 面经
  • 从0开始深入理解并发、线程与等待通知机制(中)
  • UE5报错及解决办法
  • 怎么通过docker/portainer部署vue项目
  • 【面试经典150 | 矩阵】旋转图像
  • 机器人制作开源方案 | 家庭清扫拾物机器人
  • C++算法 —— 动态规划(8)01背包问题
  • ASUS华硕天选4笔记本FA507NU7735H_4050原装出厂Win11系统
  • 金蝶OA server_file 目录遍历漏洞
  • read_image错误
  • 文本分词排序
  • SQL与关系数据库基本操作
  • 【2023年11月第四版教材】第18章《项目绩效域》(第一部分)
  • Docker启动Mysql
  • QScrollArea样式
  • 【gitlab】git push -u origin master 报403
  • 第二篇:矩阵的翻转JavaScript
  • 代码随想录算法训练营第五十七天 | 动态规划 part 15 | 392.判断子序列、115.不同的子序列
  • 【国漫逆袭】人气榜,小医仙首次上榜,霍雨浩排名飙升,不良人热度下降
  • 国庆中秋特辑(七)Java软件工程师常见20道编程面试题
  • 长剖与贪心+树上反悔贪心:1004T4
  • 二叉树经典例题
  • 什么是指针的指针和指向函数的指针?
  • 多个excel合并