elasticsearch学习,这一篇文章就够了

42 阅读4分钟

1.ES入门

1.1 准备工作

1697300352366.png 显示这个界面说明已经安装成功了

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 布尔查询

  1. 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);
    }
  1. should查询
  2. must not查询
  3. filter查询