查看“Java Elasticsearch:查询”的源代码
←
Java Elasticsearch:查询
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:ElasticSearch]] [[category:Java]] == 基本用法 == 实现ES查询的关键步骤: # 创建 RestHighLevelClient,Java ES Client对象; # 创建 '''SearchRequest''' 对象:负责设置搜索参数; # 通过 Client对象发送请求; # 处理搜索结果; === 创建“RestHighLevelClient” === 略(参考:[http://wiki.eijux.com/Java_Elasticsearch%EF%BC%9A%E5%9F%BA%E7%A1%80#.E8.BF.9E.E6.8E.A5.E9.85.8D.E7.BD.AE Java Elasticsearch:基础:连接配置]) === 创建“SearchRequest” === 创建 '''SearchRequest''' 对象步骤如下: # 创建 SearchRequest 对象; # 通过 '''SearchSourceBuilder''' '''设置搜索参数'''; # 将 SearchSourceBuilder 绑定到 SearchRequest 对象; * 实际上大部分 SearchRequest 对象的搜索参数都是通过 SearchSourceBuilder 对象间接设置。 ==== 初始化“SearchRequest” ==== SearchRequest 负责设置搜索参数,包括:ES Query、分页参数等等常用设置(通过 SearchSourceBuilder 对象间接设置)。 <syntaxhighlight lang="Java" highlight=""> // 创建SearchRequest对象,索引名=posts SearchRequest searchRequest = new SearchRequest("posts"); </syntaxhighlight> ==== 创建“SearchSourceBuilder” ==== 通过 SearchSourceBuilder 间接完成搜索参数的设置。 <syntaxhighlight lang="Java" highlight=""> // 创建SearchSourceBuilder,构建ES搜索 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); </syntaxhighlight> ===== 构造查询条件 ===== Java ES 查询条件是通过 '''QueryBuilders''' 工具类构建的: '''<pre> QueryBuilder 是所有 Java ES 查询的基础接口; </pre>''' <syntaxhighlight lang="Java" highlight=""> // 例子-构建一个Match模糊查询 QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("user", "kimchy") .fuzziness(Fuzziness.AUTO) .prefixLength(3) .maxExpansions(10); // 将QueryBuilders构建的查询,绑定到SearchSourceBuilder对象 sourceBuilder.query(matchQueryBuilder); </syntaxhighlight> 或: <syntaxhighlight lang="Java" highlight=""> // 设置ES查询条件 sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy")); </syntaxhighlight> ===== 设置分页参数 ===== <syntaxhighlight lang="Java" highlight=""> // 设置分页参数,偏移从0开始 sourceBuilder.from(0); // 设置分页参数,分页大小=5 sourceBuilder.size(5); </syntaxhighlight> ===== 设置排序参数 ===== <syntaxhighlight lang="Java" highlight=""> // 根据id字段,升序 sourceBuilder.sort("id", SortOrder.ASC); </syntaxhighlight> ===== 设置请求超时时间 ===== <syntaxhighlight lang="Java" highlight=""> // 设置请求超时时间,60秒 sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); </syntaxhighlight> ==== 将 SearchSourceBuilder 绑定到 SearchRequest 对象 ==== <syntaxhighlight lang="Java" highlight=""> // 将 SearchSourceBuilder 绑定到 SearchRequest 对象 searchRequest.source(sourceBuilder); </syntaxhighlight> === 执行请求 === <syntaxhighlight lang="Java" highlight=""> SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); </syntaxhighlight> === 处理结果 === <syntaxhighlight lang="Java" highlight=""> RestStatus status = searchResponse.status(); // ES请求状态 TimeValue took = searchResponse.getTook(); // 执行时间 Boolean terminatedEarly = searchResponse.isTerminatedEarly(); Boolean timedOut = searchResponse.isTimedOut(); // 是否超时 // 获取hits,SearchHits对象包含搜索结果 SearchHits hits = searchResponse.getHits(); // 搜索结果总数 TotalHits totalHits = hits.getTotalHits(); long numHits = totalHits.value; // 遍历搜索结果 SearchHit[] searchHits = hits.getHits(); for (SearchHit hit : searchHits) { // 获取文档内容,json字符串格式 String sourceAsString = hit.getSourceAsString(); // 获取文档内容,Map对象格式 Map<String, Object> sourceAsMap = hit.getSourceAsMap(); } </syntaxhighlight> === 完整示例 === <syntaxhighlight lang="Java" highlight=""> // 首先创建 RestClient,后续章节通过RestClient对象进行参数配置。 RestClientBuilder restClientBuilder = RestClient.builder( new HttpHost("localhost", 9200, "http"), // 设置ES服务地址,支持多个 new HttpHost("localhost", 9201, "http")); // 创建 RestHighLevelClient,请求都是通过 RestHighLevelClient 实例发出去的。 RestHighLevelClient client = new RestHighLevelClient(restClientBuilder); // 创建 SearchRequest 对象 SearchRequest searchRequest = new SearchRequest(); // 通过 SearchSourceBuilder 构建搜索参数 SearchSourceBuilder builder = new SearchSourceBuilder(); // 通过 QueryBuilders 构建ES查询条件 builder.query(QueryBuilders.termsQuery("order_id", 1,2,3,4,5)); // 设置搜索参数 searchRequest.source(builder); // 执行ES请求 SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // 获取搜索到的文档 SearchHits hits = searchResponse.getHits(); // 遍历搜索结果 SearchHit[] searchHits = hits.getHits(); for (SearchHit hit : searchHits) { // 获取文档内容,json字符串格式 String sourceAsString = hit.getSourceAsString(); // 获取文档内容,Map对象格式 Map<String, Object> sourceAsMap = hit.getSourceAsMap(); } </syntaxhighlight> == 全文搜索(MatchQueryBuilder) == 全文搜索是 Elasticsearch 的核心特性之一,Java Elasticsearch 全文搜索查询主要由 '''MatchQueryBuilder''' 这个构造器配置。 === 创建“MatchQueryBuilder” === 有两种方式创建MatchQueryBuilder # 直接实例化 MatchQueryBuilder; #: <syntaxhighlight lang="Java" highlight=""> MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", "梯子教程"); </syntaxhighlight> #* 参数1:字段名; #* 参数2:匹配关键词; # 通过 QueryBuilders 工具创建; #: <syntaxhighlight lang="Java" highlight=""> // 可以直接赋值给QueryBuilder接口定义的对象 QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "梯子教程"); </syntaxhighlight> === 创建“SearchRequest” === Java 所有的 ES 查询请求都是通过 SearchRequest 对象进行设置,因此需要实例化 SearchRequest 对象,设置 query 参数。 <syntaxhighlight lang="Java" highlight=""> SearchRequest searchRequest = new SearchRequest(); // 通过SearchSourceBuilder构建搜索参数 SearchSourceBuilder builder = new SearchSourceBuilder(); // 设置query参数,绑定前面创建的Query对象 builder.query(matchQueryBuilder); // 设置SearchRequest搜索参数 searchRequest.source(builder); </syntaxhighlight> === 执行请求 === <syntaxhighlight lang="Java" highlight=""> SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); </syntaxhighlight> === 处理结果 === (参考上一节) == 短语查询(MatchPhraseQueryBuilder) == Elasticsearch 的 match_phrase 短语查询跟 match 的区别就是,关键词作为一个整体进行搜索,而不是拆分成一个个关键词。 === 创建“MatchPhraseQueryBuilder” === 有两种方式创建MatchPhraseQueryBuilder # 直接实例化 MatchPhraseQueryBuilder; #: <syntaxhighlight lang="Java" highlight=""> MatchPhraseQueryBuilder matchPhraseQueryBuilder = new MatchPhraseQueryBuilder("title", "Elasticsearch 查询语法"); </syntaxhighlight> #* 参数1:字段名; #* 参数2:匹配关键词; # 通过 QueryBuilders 工具创建; #: <syntaxhighlight lang="Java" highlight=""> // 可以直接赋值给QueryBuilder接口定义的对象 QueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("title", "Elasticsearch 查询语法"); </syntaxhighlight> === 创建“SearchRequest” === Java 所有的 ES 查询请求都是通过 SearchRequest 对象进行设置,因此需要实例化 SearchRequest 对象,设置 query 参数。 <syntaxhighlight lang="Java" highlight=""> SearchRequest searchRequest = new SearchRequest(); // 通过 SearchSourceBuilder 构建搜索参数 SearchSourceBuilder builder = new SearchSourceBuilder(); // 设置 query 参数,绑定前面创建的 Query 对象 builder.query(matchPhraseQueryBuilder); // 设置 SearchRequest 搜索参数 searchRequest.source(builder); </syntaxhighlight> === 执行请求 === <syntaxhighlight lang="Java" highlight=""> SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); </syntaxhighlight> === 处理结果 === (参考上一节) == 等值匹配(TermQueryBuilder) == Elasticsearch 的 term 查询,主要用于实现等值匹配,类似 SQL 的 fieldname=value 表达式。 === 创建“TermQueryBuilder” === 有两种方式: # 直接实例化 TermQueryBuilder; # 通过 QueryBuilders 工具创建; <syntaxhighlight lang="Java" highlight=""> // 方式一 TermQueryBuilder termQueryBuilder = new TermQueryBuilder("order_id", 100); // 方式二 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("order_id", 100); </syntaxhighlight> 参数: * 参数1:字段名; * 参数2:匹配关键词; === 创建“SearchRequest” === Java 所有的 ES 查询请求都是通过 SearchRequest 对象进行设置,因此需要实例化 SearchRequest 对象,设置 query 参数。 <syntaxhighlight lang="Java" highlight=""> SearchRequest searchRequest = new SearchRequest(); // 通过SearchSourceBuilder构建搜索参数 SearchSourceBuilder builder = new SearchSourceBuilder(); // 设置query参数,绑定前面创建的Query对象 builder.query(termQueryBuilder); // 设置SearchRequest搜索参数 searchRequest.source(builder); </syntaxhighlight> === 执行请求 === <syntaxhighlight lang="Java" highlight=""> SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); </syntaxhighlight> === 处理结果 === (参考上一节) == IN查询(TermsQueryBuilder) == <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight> <syntaxhighlight lang="Java" highlight=""> </syntaxhighlight>
返回至“
Java Elasticsearch:查询
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息