赞
踩
一、一层嵌套
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(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。