参考文献:
ElasticSearch 中boolQueryBuilder的使用
elasticsearch基本操作之–使用QueryBuilders进行查询
es中queryBuilders api
详细-elasticsearch 中QueryBuilders的用法
Maven配置
org.elasticsearch.client elasticsearch-rest-high-level-client 6.3.2 依赖org.elasticsearch.client:elasticsearch-rest-client
org.elasticsearch:elasticsearch
文档API
1、初始化
RestHighLevelClient 实例依赖Rest Low Level Client builder创建客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost(“localhost”, 9200, “http”),
new HttpHost(“localhost”, 9201, “http”)));
High-level client 会依赖 Low-level client 来执行请求, low-level client 则会维护一个请求的线程连接池,因为当 high-level 请求处理结束时,应该 close 掉这个连接,使 low-level client 能尽快释放资源。
client.close();
2、创建索引
IndexRequest request = new IndexRequest(“posts”,“doc”,“1”);
String json = “{” +
““user”:“kimchy”,” +
““postDate”:“2013-01-30”,” +
““message”:“trying out Elasticsearch”” + “}”;
request.source(json,XContentType.JSON);
IndexResponse indexResponse = client.index(request,RequestOptions.DEFAULT);
3、查询文档内容
GetRequest getRequest = new GetRequest( “posts”, “doc”, “1”);
GetResponse getResponse = client.get(getRequest,RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsMap().get(“user”));
4、搜索排序
//创建搜索请求
SearchRequest searchRequest = new SearchRequest(“registry”);
searchRequest.types(“user”);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//降序
searchSourceBuilder.sort("_id",SortOrder.DESC);
//分页
searchSourceBuilder.from(0);
searchSourceBuilder.size(5);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse=client.search(searchRequest,RequestOptions.DEFAULT);
解释
SearchRequest 为搜索请求对象 对请求对象进行基本参数设置
//设置查询指定的某个文档库
searchRequest.types(“doc”);
//设置指定查询的路由分片
searchRequest.routing(“routing”);
//用preference方法去指定优先去某个分片上查询(默认随机)
searchRequest.preference("_local");
//向主搜索请求中可以添加搜索内容的特征参数
a、创建 搜索内容参数设置对象:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
b、将SearchSourceBuilder对象添加到搜索请求中
searchRequest.source(searchSourceBuilder);
SearchSourceBuilder
大多控制搜索内容的行为参数都可以在SearchSourceBuilder上进行设置,SearchSourceBuilder包含与Rest API的搜索请求主体中类似的参数选项。
a.查询所有的内容
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
b.查询包含关键词字段的文档:如下,查询所有包含user且user字段包含kimchy值得文档
sourceBuilder.query(QueryBuilders.termQuery(“user”, “kimchy”));
c.上面是根据QueryBuilders查询选项得,另外还可以使用MatchQueryBuilder配置查询参数
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder(“user”, “kimchy”);
// 启动模糊查询
matchQueryBuilder.fuzziness(Fuzziness.AUTO);
// 在匹配查询上设置前缀长度选项
matchQueryBuilder.prefixLength(3);
// 设置最大扩展选项以控制查询的模糊过程
matchQueryBuilder.maxExpansions(10);
d.也可以使用QueryBuilders实用程序类创建QueryBuilder对象。 请点击
注:无论用于创建它的方法是什么,都必须将QueryBuilder对象添加到SearchSourceBuilder
searchSourceBuilder.query(matchQueryBuilder);
3、设置查询得起始索引位置和数量:第一条开始返回5条数据
sourceBuilder.from(0);
sourceBuilder.size(5);
4、设置查询请求时间的超时时间:如60s没有结果就认为超市
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
5、默认情况下,搜索请求会返回文档_source的内容。也可以关闭_source检索。
sourceBuilder.fetchSource(false);
该方法还接受一个或者多个通配符模式的数组,控制以更精细的方式包含或排除哪些字段
String[] includeFields = new String[] {“title”, “user”, “innerObject.*”};
String[] excludeFields = new String[] {"_type"};
sourceBuilder.fetchSource(includeFields, excludeFields);
Scroll(游标)API
Elasticsearch中进行大数据量查询时,往往因为设备、网络传输问题影响查询数据的效率;Elasticsearch中提供了 Scroll(游标)的方式对数据进行少量多批次的滚动查询,来提高查询效率。
//设置滚动时间间隔
Scroll scroll = new Scroll(TimeValue.timeValueMinutes(时间参数));
//滚动请求体
SearchScrollRequest scrollRequest = new SearchScrollRequest(滚动Id参数).scroll(scroll);
//滚动查询
SearchResponse searchResponse = restHighLevelClient.scroll(scrollRequest,RequestOptions.Default);
//获取es查询输出的对象,进行拼装
//总查询数量
long totalHits = searchResponse.getHits.getTotalHits().value;
//滚动Id
long scrillId = searchResponse.getScrollId();
//得到匹配度高的文档
SearchHit[] searchHits = searchResponse.getHits().getHits();
//遍历得到的文档
for(SearchHit hit:searchHits){
//文档的主键
String id = hit.getId();
//源文档内容
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get(“name”);
//由于前边设置了源文档字段过虑,这时description是取不到的
String description = (String) sourceAsMap.get(“description”);
//学习模式
String studymodel = (String) sourceAsMap.get(“studymodel”);
//价格
Double price = (Double) sourceAsMap.get(“price”);
}
BoolQueryBuilder
1、filter和query的区别 query会比较查询条件,然后计算分值,最后返回文档结果; 而filter则是先判断是否满足查询条件,如不满足,会缓存查询过程(记录该文档不满足结果);满足的话,就直接缓存结果;
综上:filter快在两方面 1、对结果进行缓存 2、避免计算分值
bool查询的使用
Bool查询对应Lucene中的BooleanQuery,它由一个或者多个子句组成,每个子句都有特定的类型
1、must
返回的文档必须满足must子句的条件,并且参与计算分值。
2、filter
返回的文档必须满足filter子句的条件,但不参与计算分值。
3、should
返回的文档可能满足should子句的条件,在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要一个就可以返回。minimum_should_match参数定义了至少满足几个子句.
4、must_not
返回的文档必须不满足定义的条件。
如果一个查询既有filter又有should,那么至少包含一个should子句.
javaAPI的使用
public void () throws IOException {
SearchRequest searchRequest = new SearchRequest(“item”);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("scompCode", "G0000001"));
// 模糊查询
boolQueryBuilder.filter(QueryBuilders.wildcardQuery("itemDesc", "*手机*"));
// 范围查询 from:相当于闭区间; gt:相当于开区间(>) gte:相当于闭区间 (>=) lt:开区间(<) lte:闭区间 (<=)
boolQueryBuilder.filter(QueryBuilders.rangeQuery("itemPrice").from(4500).to(8899));
sourceBuilder.query(boolQueryBuilder);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
logger.info("查询数据:{}", Arrays.toString(searchResponse.getHits().getHits()));
}
QueryBuilders
/**
* 使用QueryBuilder
* termQuery("key", obj) 完全匹配
根据给定的字段的值的分词查询分词中包含给定的值array的文档
* termsQuery("key", obj1, obj2..) 一次匹配多个值
* matchQuery("key", Obj) 单个匹配, field不支持通配符, 前缀具高级特性
* multiMatchQuery("text", "field1", "field2"..); 匹配多个字段, field有通配符忒行
* matchAllQuery(); 匹配所有文件
*/
QueryBuilders.matchQuery(“name”, “葫芦4032娃”);
/**
* boolQuery()组合查询 注意是BoolQueryBuilder
* must(QueryBuilders) : AND
* mustNot(QueryBuilders): NOT
* should: : OR
*/
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(…)
.mustNot(…)
.should(…);
//查询字段不为null的文档。查询字段address 不为null的数据
existsQuery();
//其他查询方式:范围内查询rangeQuery(字段).from(起始).to(结束)以及rangeQuery().gte(起始)和rangeQuery().lte(结束)
、通配符查询wildcardQuery、嵌套查询nestedQuery等