1.ES入门
1.1 准备工作
- 了解kibana
- 安装的kibana地址最好与es保持一致,官网下载地址为:www.elastic.co/cn/download…
显示这个界面说明已经安装成功了
2.Java客户端
<!-- elasticSearch 客户端依赖 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.2</version>
</dependency>
<!-- elasticSearch -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.10.2</version>
</dependency>
2.关于ES基础操作
2.1 几种基本的数据类型
2.1.1.keyword类型
keyword类型是不进行切分的字符串类型,用于姓名,产品类型,用户id,url和状态码;keyword类型数据一般用于比较字符串是否相等,不对数据进行部分匹配。同时使用term查询
2.1.2.text类型
可进行切分的字符串类型,通常使用match查询
2.1.3.数值类型
数值类型支持long,integer,short,byte,float等,查询方式一般使用term查询或者范围查询
如350~400("gte":350, "lte":400)
2.1.4.布尔类型
type 设置为type,查询方式一般使用term
2.1.5.日期类型
在es中,日期类型的名称为date,为标准的UTC格式
type设置为date,默认不支持yyyy-MM-dd HH:mm:ss 如果经常使用这种自定义格式,可以设置为
“mappings" {
"properties":{
"create_time":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss"
}
}
}
2.2.数组类型
2.2.1数组类型
事先已经定义了字段类型,在写入数据的时候以数组形式写入,ES会将该类型转换为数组
“mappings" {
"properties":{
"tag":{
"type":"keyword"
}
}
}
数据写入:
{
"tag":["有车位","免费WIFI"],
}
查看写入的数据:
{
"tag":["有车位","免费WIFI"],
}
数组类型的检索方式也适用term查询
在java中查询可设置为:
searchSourceBuilder.query(QueryBuilders.termQuery("tag", keyword));
2.2 关于文档操作
2.2.1 单挑写入文档
在ES中进行文档写入请求为post
POST /${index_name}/_doc/${_id}
{ // 写入文档数据
}
上述的id就是ES中的文档id这种请求方式是用户直接定义_id值,不使用ES生成的id
如果不指定文档id ,那么该id就由ES自动生成
2.2.1 ES的搜索匹配功能
es提供了很多搜索匹配功能,既有完全匹配的term搜索,也有按照范围的rang搜索,还有按照分词匹配的match搜索,也有按照前缀匹配的suggest搜索。
2.2.2 全部检索
使用match_all,ES返回所有的文档
2.2.3 term级别搜索
1.term查询
term查询时结构化精确查询,用于查询待查询字段和查询值是否完全匹配
在java中可以调用QueryBuilders.termQuery()方法新建一个term查询,termQuery()方法可传boolean,double,float, int, long, string等类型参数,但是没有日期类型的参数
public void search() {
SearchRequest searchRequest = new SearchRequest("hotel");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("create_time", "2021-11-12 12:12:00"));
searchRequest.source(searchSourceBuilder);
printResult(searchRequest);
}
2.terms查询
terms查询是term查询的扩展形式,用于查询一个或多个值与待查询字段是否完全匹配。
// 下述使用terms查询城市为**"北京"或者"天津"**的文档
public void termsSearch() {
SearchRequest searchRequest = new SearchRequest("hotel");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termsQuery("city", "北京", "天津"));
searchRequest.source(searchSourceBuilder);
printResult(searchRequest);
}
3.range查询
range查询用于范围查询,一般是对数值型和日期型数据的查询。使用range进行范围查询时,用户可以按照需求中是否包含边界值进行选项设置,可以组合使用
gt | 大于 |
---|---|
lt | 小于 |
gte | 大于或等于 |
lte | 小于或等于 |
4.exist查询
在一些场景下,我们希望查询某个字段不为空的文档,可使用exists查询,字段不为空的条件有
- 值存在且不为null
- 值不是空数组
- 值是数组,但不是[null]
4.2.3 布尔查询
- must查询
当查询中包含must查询时,相当于逻辑查询中的"与"查询,命中的文档必须匹配该子查询的结果,并且ES会将该子查询与文档的匹配程度值加入总得分中。
在Java客户端构建must查询时,可使用QueryBuilders.BoolQuery().must()进行构建,上面range查询例子改为Java客户端请求的形式为:
// 查询城市在北京且价格在300~500的酒店
public void mustSearch() {
SearchRequest searchRequest = new SearchRequest("hotel");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 构建城市term查询
boolQueryBuilder.must(QueryBuilders.termQuery("city", "北京"));
// 构建酒店价格range查询
boolQueryBuilder.must(QueryBuilders.rangeQuery("price").gte(500).lte(300));
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
printResult(searchRequest);
}
- should查询
- must not查询
- filter查询