目前在做基于ElasticSearch的搜索实现,采用ElasticSearch提供的Java API实现,用TransportClient连接到ES的Cluster。
根据经验,一个搜索请求应该走这样的流程:
- Analyzer分析Query Term
- 根据Analyzer的结果构建TermQuery
- 发送Query请求给ES
- 处理返回结果
想找一段Sample Code,可是一直没找到ES里合适的Analyzer类,很奇怪为什么直接发JSON请求很简单的事,Java处理起来这么复杂(用JSON请求见:http://www.elasticsearch.org/guide/reference/query-dsl/query-string-query.html)。
静态在StackOverFlow的一个问题里无意看到了这个类:QueryStringQueryBuilder,一切问题迎刃而解了
代码解析
1 创建客户端
Settings settings = ImmutableSettings.settingsBuilder()
.put("client.transport.sniff", true)
.put("client", true)
.put("data",false)
.put("clusterName","elasticsearch")
.build();
client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(hostName, 9300));
2 创建StringQuery对象:
QueryStringQueryBuilder = new QueryStringQueryBuilder(parameters.getQueryTerm());
queryStringBuilder.useDisMax(true);
queryStringBuilder.field("title",160);
queryStringBuilder.field("desc",1);
3 构建SearchRequest
SearchRequestBuilder builder= client.prepareSearch("indexName")
.setTypes("collectionName")
.setSearchType(SearchType.DEFAULT)
.setFrom(parameters.getStart())
.setSize(parameters.getCount());
builder.setQuery(queryStringBuilder);
这样,一个基本ElasticSearch请求就构建成功了。
Query 还是 Filter
以前一直弄不清楚为什么Filter也干一些Query可以做的事情,比如查询的附件条件是分类值为”1“,用TermQuery可是实现,用TermFilter也可以实现,为什么有重复的功能。
根据这里(http://es-cn.medcl.net/guide/reference/query-dsl/),可以看出,Filter最大的好处是可以实现缓存,并且不需要计算得分。
完善后的搜索
根据上面的结论,重新把搜索条件里的其他限定条件用Filter实现,代替掉原来的Query实现:
FilterBuilder categoryFilterBuilder = FilterBuilders.termFilter("categoryId", parameters.getCategoryId());
String[] ids = new String[parameters.getTypeIds().size()];
parameters.getTypeIds().toArray(ids);
FilterBuilder inFilter = FilterBuilders.inFilter("typeId", ids);
builder.setFilter(filterBuilder);
最后执行搜索:
SearchResponse response = builder.execute().actionGet();
分享到:
相关推荐
NULL 博文链接:https://m635674608.iteye.com/blog/2231884
对应的ElasticSearch版本为6.0,因为版本升级后ES更换了初始化的方法,所以网上有一些代码示例并不准确,希望这个示例对大家有帮助,主要写了CRUD的基本功能。
基于Elasticsearch2.1.1的JavaAPI基本操作代码示例
本资源为一个使用Maven管理的ElasticSearch示例项目,项目中使用了Paoding分词器,项目开发过程可参见http://blog.csdn.net/geloin/article/details/8933825
ElasticSearch Java API 中文文档 ElasticSearch Java API 中文文档
赠送jar包:elasticsearch-rest-high-level-client-6.8.3.jar;...标签:elasticsearch、client、rest、high、level、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵
rest client全套封装好的java调用elasticsearch功能的工程demo,亲测可用。我安装的es是elasticsearch-7.10.0版本,测试好用。直接用idea打开工程就可以使用,并且有写好的junit测试类,可供测试。可以直接拿来做应用...
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。 ElasticSearch提供javaAPI,使用者可以...
标签:elasticsearch、client、rest、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
Java做客户端对Elasticsearch服务的增删改查及批量修改操作,代码简洁易懂,思路清晰有注释.详情参考https://blog.csdn.net/linhaiyun_ytdx/article/category/7042758
Elasticsearch客户端常用代码封装实例 基于MyBatis Plus的Java High Level Client ES客户端的常用操作 如:增删改查、聚合查询、客户端封装、节点嗅探等常用代码示例
标签:elasticsearch、client、rest、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译...
基于elasticsearch java client封装的elasticsearch
Elasticsearch-Java-client-api Elasticsearch的java客户端使用示例 工程说明: 一. es-hrest-client-src工程: Elasticsearch的高级别的REST客户端使用示例 二、es-java-client-src工程: Elasticsearch的Transport...
java如何调用Elasticsearch(连接、查询、分页、排序、统计、模糊匹配、精准匹配、文字高亮)源码
今天小编就为大家分享一篇关于JAVA使用Elasticsearch查询in和not in的实现方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
在eclipse上,操作elasticsearch的简单程序
Java API整合ES实现深分页,高亮等操作
Elasticsearch5.5.1 JAVA客户端TransportClient相关的示例,包含CRUD,bulk,相关介绍请参考:http://blog.csdn.net/u011781521/article/details/77848489
好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个开源的高拓展的分布式全文搜索引擎它可以近乎实时的存储、检索数据;本身拓展性很好,可以拓展到上百台服务器,处理PB级别的数据。es也是用Java开发并使用...