ElasticSearch高级 *** 作

ElasticSearch高级 *** 作,第1张

ElasticSearch高级 *** 作

文章目录

ElasticSearch高级 *** 作

批量 *** 作-脚本批量 *** 作-Java API导入数据

需求在ES中创建索引添加文档 把mysql数据库中的数据利用bulk批量 *** 作迁移到es中各种查询

使用matchAll查询所有数据使用matchAll-JavaAPI进行查询 *** 作使用term词条进行查询使用term-JavaAPI进行查询使用match查询使用match-JavaAPI查询模糊查询模糊查询-JavaAPI进行查询范围查询范围查询-JavaAPI进行查询排序查询queryString查询querString查询-JavaAPI进行查询布尔查询

ElasticSearch高级 *** 作 批量 *** 作-脚本

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

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

批量 *** 作代码,如下图:

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

批量 *** 作-Java API

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

    @Test
    public void testBulk() throws IOException {
        //创建bulkrequest对象,整合所有 *** 作
        BulkRequest bulkRequest = new BulkRequest();

        
        DeleteRequest deleteRequest = new DeleteRequest("person", "1");
        bulkRequest.add(deleteRequest);

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

        HashMap 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 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": [{},{}...]
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5711041.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存