博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch的java搜索语法
阅读量:5094 次
发布时间:2019-06-13

本文共 2620 字,大约阅读时间需要 8 分钟。

elasticsearch作为开源的搜索引擎,支持复杂的搜索,本文示例用java客户端实现的搜索。

1、maven引入依赖jar包

12345
     
org.elasticsearch
     
elasticsearch
     
1.1.0

2、产生client

12345
Settings settings = ImmutableSettings.settingsBuilder()            .put("client.transport.sniff", true)            .build();         TransportClient client = new TransportClient(settings);

3、使用query查询

12345678910
SearchResponse actionGet = client.prepareSearch("indexName")                    .setTypes("typeName")                    .setQuery(                  QueryBuilders.boolQuery().must(QueryBuilders.termQuery("attr1", "value1"))                     ).execute().actionGet();        SearchHits hits = actionGet.getHits();        List
> matchRsult = new LinkedList
>(); for (SearchHit hit : hits.getHits()) { matchRsult.add(hit.getSource()); }

查询条件有好多种形式,都可以通过QueryBuilders来构建组合:

12
QueryBuilders.inQuery("attr1", new String[{"value1","value2","value3"});QueryBuilders.rangeQuery("attr1").gt("value1")//gt lt eq gte lte;

查询的形式和意思都可以根据方法名猜测的出来。

4、使用filter查询

filter和query的使用方式类似,它是使用FilterBuilders来构建查询条件。

不过比query多了or、and关系查询

12
FilterBuilders.orFilter(FilterBuilders.termFilter("attr1", "value1"),FilterBuilders.termFilter("attr2", "value2"));FilterBuilders.andFilter(FilterBuilders.termFilter("attr1", "value1"),FilterBuilders.termFilter("attr2", "value2"));

是通过 .setPostFilter(filter) 指定给search;

5、分页查询
一种方式是指定from/size

12345678
SearchResponse actionGet = elasticClient.prepareSearch("indexName")            .setTypes("typeName")            .setQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("attr1", "value1"))             )            .setFrom(100)            .setSize(200)            .execute().actionGet();

另外一种是使用Scroll/size,如果结果超过size大小,会返回size条记录,并返回一个scrollId,可以用这个scrollId继续往下查询。

第一次查询

12345678
SearchResponse actionGet = elasticClient.prepareSearch("indexName")            .setTypes("typeName")            .setQuery(             QueryBuilders.boolQuery().must(QueryBuilders.termQuery("attr1", "value1")) )            .setScroll(new TimeValue(60000))            .setSize(200)            .execute().actionGet(); 	String scrollId = actionGet.getScrollId();

后面的查询

123
SearchResponse actionGet = elasticClient.prepareSearchScroll(actionGet.getScrollId())	.setScroll(new TimeValue(600000))	.execute().actionGet();

第二种分页查询必须在设定的缓存时间内往下查询,而且一旦进行了查询就必须往下继续查,不能回头重复查询。

转载于:https://www.cnblogs.com/dayuyanwei/p/7026043.html

你可能感兴趣的文章
cer证书签名验证
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
QML学习笔记之一
查看>>
App右上角数字
查看>>
小算法
查看>>
201521123024 《java程序设计》 第12周学习总结
查看>>
新作《ASP.NET MVC 5框架揭秘》正式出版
查看>>
IdentityServer4-用EF配置Client(一)
查看>>
WPF中实现多选ComboBox控件
查看>>
读构建之法第四章第十七章有感
查看>>
Windows Phone开发(4):框架和页 转:http://blog.csdn.net/tcjiaan/article/details/7263146
查看>>
python asyncio 异步实现mongodb数据转xls文件
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
IOS-图片操作集合
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
测试计划
查看>>
Mysql与Oracle 的对比
查看>>
jquery实现限制textarea输入字数
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>