ElasticSearch高级操作

Posted 杀手不太冷!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch高级操作相关的知识,希望对你有一定的参考价值。

文章目录

ElasticSearch高级操作

批量操作-脚本

Bulk批量操作是将文档的增删改查一系列操作,通过一次请求全都做完,减少网络传输次数。

具体的语法格式,如下图:

批量操作代码,如下图:

执行批量操作之后的结果,如下图:

批量操作-Java API

执行一下Java API操作bulk的代码,如下图:

/**
     * 1.批量操作  bulk
     * */
    @Test
    public void testBulk() throws IOException 
        //创建bulkrequest对象,整合所有操作
        BulkRequest bulkRequest = new BulkRequest();

        /**
         * 1. 删除1号记录
         * 2. 添加6号记录
         * 3. 修改3号记录为小王五
         * */
        DeleteRequest deleteRequest = new DeleteRequest("person", "1");
        bulkRequest.add(deleteRequest);

        HashMap<String, Object> map = new HashMap<>();
        map.put("name","小六子");
        map.put("address","奇葩星球");
        IndexRequest indexRequest = new IndexRequest("person").id("6").source(map);
        bulkRequest.add(indexRequest);

        HashMap<String, Object> map2 = new HashMap<>();
        map2.put("name","小王五");
        UpdateRequest updateRequest = new UpdateRequest("person", "3").doc(map2);
        bulkRequest.add(updateRequest);


        BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        RestStatus status = response.status();
        System.out.println(status);
    

检验ES搜索引擎中的结果,如下图:

发现使用Java API进行bulk批量操作成功。

导入数据

需求

需求:将数据库中Goods表的数据导入到ElasticSearch中

案例:实现步骤

​ 1.创建goods索引

​ 2.查询Goods表数据

​ 3.批量添加到ElasticSearch中

首先来看一下mysql中的goods表,如下图:

在ES中创建索引

PUT goods

  "mappings": 
    "properties": 
      "title": 
        "type": "text",
        "analyzer": "ik_smart"
      ,
      "price": 
        "type": "double"
      ,
      "createTime": 
        "type": "date"
      ,
      "categoryName": 
        "type": "keyword"
      ,
      "brandName": 
        "type": "keyword"
      ,
      "spec": 
        "type": "object"
      ,
      "saleNum": 
        "type": "integer"
      ,
      "stock": 
        "type": "integer"
      
    
  

title:商品标题

price:商品价格

createTime:创建时间

categoryName:分类名称。如:家电,手机

brandName:品牌名称。如:华为,小米

sprc:商品规格。如:spec:“屏幕尺寸”,“5寸”,“内存大小”,“128G”

saleNum:销量

stock:库存量

添加文档

POST goods/_doc/1

  "title":"小米手机",
  "price":1000,
  "createTime":"2019-12-01",
  "categoryName":"手机",
  "brandName":"小米",
  "saleNum":3000,
  "stock":10000,
  "spec":
    "网络制式":"移动4G",
    "屏幕尺寸":"4.5"
  


把mysql数据库中的数据利用bulk批量操作迁移到es中

查看es中的结果,如下图:

各种查询

使用matchAll查询所有数据

matchAll查询:查询所有文档

语法:

GET 索引名称/_search

    "query": 
        "match_all": 
    

注意:默认情况下,es一次展示10条数据

那如果我们想要让es显示多条数据该怎么办呢?我们可以加上两个参数,from和size,如下图:

使用matchAll-JavaAPI进行查询操作

@Test
    public void testMatchAll() throws IOException 
        //1.查询
        SearchRequest searchRequest = new SearchRequest("goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        QueryBuilder query = QueryBuilders.matchAllQuery();
        sourceBuilder.query(query);

        searchRequest.source(sourceBuilder);

        //添加分页信息,从第0条数据开始查,查询100条数据
        sourceBuilder.from(0);
        sourceBuilder.size(100);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        SearchHits hits = searchResponse.getHits();

        //获取总记录数
        long value = hits.getTotalHits().value;
        System.out.println("总记录数:"+value);

        List<Goods> goodsList=new ArrayList<>();

        //获取Hits查询到的数据  数组
        SearchHit[] hits2 = hits.getHits();
        for (SearchHit hit : hits2)
            //获取json字符串格式的数据
            String sourceAsString = hit.getSourceAsString();
            //转为java对象
            Goods goods = JSON.parseObject(sourceAsString, Goods.class);
            goodsList.add(goods);
        



    

使用term词条进行查询

使用term-JavaAPI进行查询

@Test
    public void testTermQuery() throws IOException 

        SearchRequest searchRequest = new SearchRequest("goods");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //term词条查询
        QueryBuilder query=QueryBuilders.termQuery("categoryName","机");
        searchSourceBuilder.query(query);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println(searchResponse.getHits().getTotalHits().value);

    

使用match查询

match查询:

​ 会对查询关键字进行分词

​ 然后将分词后的查询条件和词条进行等值匹配

​ 默认取并集

语法:

GET 索引名称/_search

    "query": 
        "match": 
            "字段名称": "查询条件"
        
    

使用match-JavaAPI查询

@Test
    public void testMatchQuery() throws IOException 
        SearchRequest searchRequest = new SearchRequest("goods");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //match匹配查询
        QueryBuilder query=QueryBuilders.matchQuery("brandName","联系起来");
        searchSourceBuilder.query(query);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println(searchResponse.getHits().getTotalHits().value);
    

模糊查询

wildcard查询:会对查询条件进行分词。还可以使用通配符?(任意单个字符)和*(0个或多个字符)

模糊查询-JavaAPI进行查询

@Test
    public void testWildcardQuery() throws IOException 
        SearchRequest searchRequest = new SearchRequest("goods");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //match匹配查询
        QueryBuilder query=QueryBuilders.wildcardQuery("brandName","联系*");
        searchSourceBuilder.query(query);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println(searchResponse.getHits().getTotalHits().value);
    

范围查询

范围查询-JavaAPI进行查询

@Test
    public void testRangeQuery() throws IOException 
        SearchRequest searchRequest = new SearchRequest("goods");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //范围查询
        RangeQueryBuilder query=QueryBuilders.rangeQuery("price");

        //指定下限
        query.gte(3000);
        //指定上限
        query.lte(4000);

        searchSourceBuilder.query(query);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println(searchResponse.getHits().getTotalHits().value);
    

排序查询

语法格式:

"sort": 
    "排序字段": 
        "order": "desc/asc"
    

queryString查询

概念:queryString查询会对查询关键字进行分词,并且可以一次性查询多个字段,最后把查询到的文档合并。

queryString:

​ 会对查询条件进行分词。

​ 然后将分词后的查询条件和词条进行等值匹配。

​ 默认取并集(OR)

​ 可以指定多个查询字段

GET 索引名称/_search

    "query": 
        "query_string": 
            "fields": ["字段1","字段2"...],
            "query": "查询条件1 OR 查询条件2"
        
    

querString查询-JavaAPI进行查询

@Test
    public void testQueryStringQuery() throws IOException 
        SearchRequest searchRequest = new SearchRequest("goods");

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //queryString
        QueryStringQueryBuilder query = QueryBuilders.queryStringQuery("华为手机").field("title")
                .field("categoryName").field("brandName");

        searchSourceBuilder.query(query);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println(searchResponse.getHits().getTotalHits().value);
    

布尔查询

如果我们查询的时候,一次有多个查询条件的话,那么我们可以使用布尔查询。

boolQuery:布尔查询,可以对多个查询条件进行连接。

must(and):条件必须成立

must_not(not):条件必须不成立

should(or):条件可以成立

filter:条件必须成立,性能比must高。不会计算得分。

语法:

GET 索引名称/_search

    "query": 
        "bool": 
            "must": [,...],
            "filter": [,...],
            "must_not": [,...],
            "should": [,...]
        
    

以上是关于ElasticSearch高级操作的主要内容,如果未能解决你的问题,请参考以下文章

初识ElasticSearch -批量操作之bulk | 条件查询 | 其它查询

初识ElasticSearch -批量操作之bulk | 条件查询 | 其它查询

小白学习-ElasticSearch教程 -批量操作之bulk | 条件查询 | 其它查询

elasticsearch postman操作

Elasticsearch7.8.0版本入门——JavaAPI操作(条件查询文档)

elasticsearch-rest-high-level-client操作elasticsearch