Elasticsearch API的使用

参考文献:

Elasticsearch API的使用

搜索管理:含java操作

ElasticSearch 中boolQueryBuilder的使用

elasticsearch基本操作之–使用QueryBuilders进行查询
es中queryBuilders api
详细-elasticsearch 中QueryBuilders的用法

Elasticsearch的查询说明

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等

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值