ELasticSearch Query DSL教程

142 阅读10分钟

初步检索_cat

GET _cat/nodes 查看所有节点
GET _cat/health 查看es健康状态
GET _cat/master 查看主节点
GET _cat/indices 查看所有索引

索引

创建索引/put

[put] [http://127.0.0.1:9200/shop](http://127.0.0.1:9200/shop)

查看索引/get

[get] [http://127.0.0.1:9200/shop](http://127.0.0.1:9200/shop)

索引不能重复创建

删除索引/delete

[delete] [http://127.0.0.1:9200/shop](http://127.0.0.1:9200/shop)

查看所有索引

[get] [http://127.0.0.1:9200/_cat/indices/?v](http://127.0.0.1:9200/_cat/indices/?v)

文档

创建文档/post/put

指定id [post/put] [http://localhost:9200/shop/_create/1003](http://localhost:9200/shop/_create/1003) [http://localhost:9200/shop/_doc/1003](http://localhost:9200/shop/_create/1003)

随机id [post] [http://localhost:9200/shop/_](http://localhost:9200/shop/_create)create [http://localhost:9200/shop/_doc](http://localhost:9200/shop/_doc)

这里只能使用post请求不能使用put请求,因为每次创建一个文档都会返回一个随机的id(由es创建的),所以这个请求不是幂等性的,而put请求要求必须是幂等性的,post则没有此要求,是不是幂等性都可以

如果请求中自定义id,那么每次返回的结果中id都是不变的,这样就符合幂等性,因此post或put都可以

【post】

【put】

【put】

【post】

把_doc换成_create也同样可以创建文档

查看全部文档

[get] [http://localhost:9200/shop/](http://localhost:9200/shop/)_search

查看单条文档根据id

[get] [http://localhost:9200/shop/_doc/1001](http://localhost:9200/shop/_doc/1001)

全量更新=覆盖put/post

[put/post] [http://localhost:9200/shop/_doc/100](http://localhost:9200/shop/_doc/1003)1

其实相当于新增了一条指定id的文档,因为这条id已经存在,所以会更新原来的

局部更新/post

[post] [http://localhost:9200/shop/_update/1001](http://localhost:9200/shop/_update/1001)

删除文档

[delete] [http://localhost:9200/shop/_doc/1001](http://localhost:9200/shop/_doc/1001)

根据查询条件删除

http://localhost:9200/hotfix/`_delete_by_query`

进阶查询

es真正的核心是查询

条件查询

[http://localhost:9200/shop/_search?q=category:](http://localhost:9200/shop/_search?q=category:)苹果

在请求路径中添加参数是很麻烦的,且中文容易乱码,因此在请求体中写参数

[get] http://localhost:9200/shop/_search
{
    "query": {
        "match": {
            "category": "华为"
        }
    }
}

请求体中的全量查询

分页查询

[post] http://localhost:9200/shop/_search
{
    "query": {
        "match_all": {
        }
    },
    "from": 0,
    "size": 2
}

只展示指定字段

[post] http://localhost:9200/shop/_search
{
    "query": {
        "match_all": {

        }
    },
    "from": 0,
    "size": 2,
    "_source":["title","category"]
}

排序查询

{
    "query": {
        "match_all": {}
    },
    "from": 0,
    "size": 5,
    "_source": [
        "title",
        "category"
    ],
    "sort": [
        {
            "price": {
                "order": "desc"  // 降序 desc  升序 asc
            }
        }
    ]
}

多条件查询(同时成立)

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "category": "小米"
                    }
                },
                {
                    "match": {
                        "price": 5199.0
                    }
                }
            ]
        }
    }
}

多条件查询(或者)

{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "category": "苹果"
                    }
                },
                {
                    "match": {
                        "category": "华为"
                    }
                }
            ]
        }
    }
}

多条件范围查询

{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "category": "小米"
                    }
                },
                {
                    "match": {
                        "category": "华为"
                    }
                }
            ],
            "filter": [
                {
                    "range": {
                        "price": {
                            "gte": 5000,
                            "lte": 5500
                        }
                    }
                }
            ]
        }
    }
}

完全匹配查询

正常情况下,都是会分词查询的,也就是说输入“小华”,会自动拆分成“小”和“华”,就会查出所有小米和华为的数据,但是有时候我不想让它分词,就想让它只查出“小华”,此时就是完全匹配

http://localhost:9200/shop/_search
{
    "query":{
        "match_phrase":{
            "category":"小华"
        }
    }
}

高亮查询

http://localhost:9200/shop/_search
{
    "query": {
        "match_phrase": {
            "category": "小华"
        }
    },
    "highlight": {
        "fields": {
            "category": {}
        }
    }
}

聚合查询

// 分组查询
{
    "aggs": {//聚合操作
        "price_group": {
            "terms": {
                "field": "price"
            }
        }
    },
    "size": 0 // 不显示原始数据
}

// 平均值
{
    "aggs": {
        "price_avg": {
            "avg": {
                "field": "price"
            }
        }
    },
    "size": 0
}

映射

创建映射

[put] http://localhost:9200/user/_mapping
// 创建映射对应着MySQL里创建表结构,此索引里有三个字段name,sex,tel
{
    "properties": {
        "name": {
            "type": "text", // 文本类型,可以被分词
            "index": true // 可以被索引到
        },
        "sex": {
            "type": "keyword", // 关键字,不可以被分词
            "index": true
        },
        "tel": {
            "type": "keyword",
            "index": false // 不能被索引到
        }
    }
}

查询映射

[get] [http://localhost:9200/user/_mapping](http://localhost:9200/user/_mapping)

映射关系

先查询索引全部文档

根据name查询,name的类型是text,所以会被分词

根据sex查询,sex的类型是keyword,所以不会被分词,只会精确查找

查询sex是女,只会查出来是sex=女,不会查出来女的,女性等包含女字的

index设置为false,代表不能根据这个字段被查询到

JavaAPI

创建索引

		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        // 创建索引
        CreateIndexRequest user = new CreateIndexRequest("user");
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(user, RequestOptions.DEFAULT);
        // 响应状态
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println("创建索引:"+acknowledged);
        restHighLevelClient.close();

查询索引

		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        // 查询索引
        GetIndexRequest user = new GetIndexRequest("user");
        GetIndexResponse getIndexResponse = restHighLevelClient.indices().get(user, RequestOptions.DEFAULT);
        // 响应结果
        // 索引别名
        Map<String, List<AliasMetadata>> aliases = getIndexResponse.getAliases();
        // 索引映射
        Map<String, MappingMetadata> mappings = getIndexResponse.getMappings();
        // 索引设置
        Map<String, Settings> settings = getIndexResponse.getSettings();
        System.out.println(aliases);
        System.out.println(mappings);
        System.out.println(settings);
        // 关闭连接
        restHighLevelClient.close();

删除索引

		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        // 删除索引
        DeleteIndexRequest user = new DeleteIndexRequest("user");
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(user, RequestOptions.DEFAULT);
        // 响应结果
        boolean acknowledged = delete.isAcknowledged();
        System.out.println(acknowledged);
        // 关闭连接
        restHighLevelClient.close();

创建文档

		RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
				RestClient.builder(new HttpHost("106.14.42.235", 9200, "http")));
		// 初始化请求参数
		IndexRequest indexRequest = new IndexRequest();
		// 定义索引名,文档ID
		indexRequest.index("user").id("100001");
		// 准备一个json格式的字符串作为文档内容
		User user = new User("安迪","男",25);
		String userJsonString = JSON.toJSONString(user);
		// 定义数据源并规定格式为json格式
		indexRequest.source(userJsonString,XContentType.JSON);
		IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
		System.out.println(indexResponse.getResult());
		restHighLevelClient.close();

修改文档局部

		RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
				RestClient.builder(new HttpHost("106.14.42.235", 9200, "http")));
		// 初始化修改的请求参数
		UpdateRequest updateRequest = new UpdateRequest();
		// 定义要修改的索引名,文档ID
		updateRequest.index("user").id("100001");
		updateRequest.doc(XContentType.JSON,"name","马林");
		UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
		System.out.println(update);
		restHighLevelClient.close();

查看文档

		// 初始化修改的请求参数
		GetRequest getRequest = new GetRequest();
		// 定义要查看的索引名,文档ID
		getRequest.index("user").id("100001");
		GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
		System.out.println(getResponse);
		restHighLevelClient.close();

删除文档

		RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
				RestClient.builder(new HttpHost("106.14.42.235", 9200, "http")));
		// 初始化删除的请求参数
		DeleteRequest deleteRequest = new DeleteRequest();
		// 定义要删除的索引名,文档ID
		deleteRequest.index("user").id("100001");
		DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
		System.out.println(delete);
		restHighLevelClient.close();

批量新增

 // 第一种写法 		
		// 创建ES客户端
		RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.add(new IndexRequest().index("user").source(XContentType.JSON,"name", "张三", "age","18", "sex", "man"));
        bulkRequest.add(new IndexRequest().index("user").source(XContentType.JSON,"name", "李四", "age","19", "sex", "man"));
        bulkRequest.add(new IndexRequest().index("user").source(XContentType.JSON,"name", "王五", "age","17", "sex", "man"));
        BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulk.getTook());
        System.out.println(bulk.getItems());
        // 关闭连接
        restHighLevelClient.close();
// 第二种写法
		 // 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        User user1 = new User("小红", "女的", 11);
        User user2 = new User("小李", "男的", 12);
        User user3 = new User("小刚", "男的", 13);
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.add(new IndexRequest().index("user").source(JSON.toJSONString(user1), XContentType.JSON));
        bulkRequest.add(new IndexRequest().index("user").source(JSON.toJSONString(user2), XContentType.JSON));
        bulkRequest.add(new IndexRequest().index("user").source(JSON.toJSONString(user3), XContentType.JSON));
        BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulk.getTook());
        System.out.println(bulk.getItems());
        // 关闭连接
        restHighLevelClient.close();

批量删除

		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.add(new DeleteRequest().index("user").id("10101"));
        bulkRequest.add(new DeleteRequest().index("user").id("10102"));
        bulkRequest.add(new DeleteRequest().index("user").id("10103"));
        BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulk.getTook());
        System.out.println(bulk.getItems());
        // 关闭连接
        restHighLevelClient.close();

全量查询

		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件 全量查询
        searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
        // 执行查询
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits.getTotalHits());
        System.out.println(search.getTook());
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭连接
        restHighLevelClient.close();

条件查询

		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件 sex=man
        searchRequest.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("sex","man")));
        //
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits.getTotalHits());
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭连接
        restHighLevelClient.close();

分页查询

 		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件 全量查询
        SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // 定义查询条件 分页查询 第3页 每页4条数据 from的值 =(当前页码-1)*页面尺寸
        query.from(8);
        query.size(4);
        searchRequest.source(query);
        //
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits.getTotalHits());
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭连接
        restHighLevelClient.close();

排序查询

  		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件 全量查询
        SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // 定义查询条件 排序(倒序desc 正序asc)
        query.sort("age", SortOrder.DESC);
        searchRequest.source(query);
        //
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits.getTotalHits());
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭连接
        restHighLevelClient.close();

过滤字段查询

		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件 全量查询
        SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // 定义查询条件 过滤字段 只显示规定字段(name age)
        String[] includes = {"name","age"};
        String[] excludes = {};
        query.fetchSource(includes, excludes);
        searchRequest.source(query);
        //
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits.getTotalHits());
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭连接
        restHighLevelClient.close();

组合查询

// 同时满足多个条件
 		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件 全量查询
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // 定义查询条件 组合查询 同时满足age=10 name=aaa
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.matchQuery("age","10"));
        boolQueryBuilder.must(QueryBuilders.matchQuery("name","aaa"));
        searchSourceBuilder.query(boolQueryBuilder);
        searchRequest.source(searchSourceBuilder);

        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits.getTotalHits());
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭连接
        restHighLevelClient.close();
// 满足多个条件之一
		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件 全量查询
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 定义查询条件 组合查询 满足 age=10 age=15 之一
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.should(QueryBuilders.matchQuery("age","10"));
        boolQueryBuilder.should(QueryBuilders.matchQuery("age","15"));
        // 查询范围全量查询
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        // 再加上组合查询
        searchSourceBuilder.query(boolQueryBuilder);
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits.getTotalHits());
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭连接
        restHighLevelClient.close();

范围查询

		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件 全量查询
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 定义查询条件 范围查询 >=11 <20
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
        rangeQueryBuilder.gte("11");
        rangeQueryBuilder.lt("20");
        // 查询范围全量查询
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        // 再加上组合查询
        searchSourceBuilder.query(rangeQueryBuilder);
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits.getTotalHits());
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭连接
        restHighLevelClient.close();

模糊查询

 		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 定义查询条件 模糊查询 name = ggg 或  与ggg只差两个字符的相似的
        FuzzyQueryBuilder fuzziness = QueryBuilders.fuzzyQuery("name", "ggg").fuzziness(Fuzziness.TWO);
        // 查询范围全量查询
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        // 再加上模糊查询
        searchSourceBuilder.query(fuzziness);
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits.getTotalHits());
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
        // 关闭连接
        restHighLevelClient.close();

高亮查询

// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        // 定义查询条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 定义查询条件 
        TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "ggg");

        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<font color='red'>");
        highlightBuilder.postTags("</font>");
        highlightBuilder.field("name");
        // 再加上高亮
        searchSourceBuilder.query(termsQueryBuilder);
        searchSourceBuilder.highlighter(highlightBuilder);
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(hits);
        for (SearchHit hit : hits) {
            System.out.println(hit.getHighlightFields());
        }
        // 关闭连接
        restHighLevelClient.close();

查询最大值

 		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 定义最大值的字段和别名
        MaxAggregationBuilder field = AggregationBuilders.max("maxAge").field("age");
        searchSourceBuilder.aggregation(field);
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        restHighLevelClient.close();

分组查询

 		// 创建ES客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("106.14.42.235", 9200, "http"))
        );
        SearchRequest searchRequest = new SearchRequest();
        // 定义查询索引
        searchRequest.indices("user");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        // 定义分组字段和别名 按年龄分组
        TermsAggregationBuilder field = AggregationBuilders.terms("groupAge").field("age");
        searchSourceBuilder.aggregation(field);
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        for (SearchHit hit : search.getHits()) {
            System.out.println(hit.getSourceAsString());
        }
        restHighLevelClient.close();

安装ik分词器

ik分词器版本应该和es版本一致,这里我选用7.14.2,es内置了很多分词器,但默认不支持中文分词,只支持英文分词,ik分词器可以进行中文分词

# 在plugins目录下下载ik分词器
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.2/elasticsearch-analysis-ik-7.14.2.zip
# 在plugins目录下新建ik目录
mkdir ik
# 如果unzip命令未找到,则先下载unzip命令
yum install unzip
# 解压到ik目录下(-d 指定目录)
 unzip -d ik elasticsearch-analysis-ik-7.14.2.zip
# 更改权限
chmod -R 777 ik/
# plugins目录下最好不要存放其他文件,只存放解压好的插件
# 进入es容器内部查看安装是否成功
 docker exec -it elasticsearch /bin/bash
# 来到bin目录下,查看已安装插件列表
 elasticsearch-plugin list
# 出现ik则说明安装插件成功
# 重启容器生效
docker restart elasticsearch

在线安装

root@1d4be2e987e9:/usr/share/elasticsearch/bin# ./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.14/elasticsearch-analysis-ik-5.6.14.zip

检查ik分词器功能

检查ik分词器插件是否安装成功

ik_smart模式

ik_max_word

不用ik分词器,使用es内置的标准分词器效果如下

中文:

英文:

集成spring data