ElasticSearch高级操作

这篇具有很好参考价值的文章主要介绍了ElasticSearch高级操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、批量操作

1、脚本形式

例:
#删除5号
#新增8号
#更新2号 name为2号

POST _bulk
{"delete":{"_index":"person1","_id":"5"}}
{"create":{"_index":"person1","_id":"8"}}
{"name":"八号","age":18,"address":"北京"}
{"update":{"_index":"person1","_id":"2"}}
{"doc":{"name":"2号"}}

2、java操作

//创建bulkrequest对象,整合所有操作
BulkRequest bulkRequest =new BulkRequest();
/*
# 1. 删除5号记录
# 2. 添加6号记录
# 3. 修改3号记录 名称为 “三号”
*/
//1. 删除5号记录
DeleteRequest deleteRequest=new DeleteRequest("person1","5");
bulkRequest.add(deleteRequest);

//2. 添加6号记录
Map<String, Object> map=new HashMap<>();
map.put("name","六号");
IndexRequest indexRequest=new IndexRequest("person1").id("6").source(map);
bulkRequest.add(indexRequest);

//3. 修改3号记录 名称为 “三号”
Map<String, Object> mapUpdate=new HashMap<>();
mapUpdate.put("name","三号");
UpdateRequest updateRequest=new UpdateRequest("person1","3").doc(mapUpdate);
bulkRequest.add(updateRequest);

//执行批量操作
BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(response.status());

 3、从数据库写入数据

//1.查询所有数据,mysql
List<Goods> goodsList = goodsMapper.findAll();

//2.bulk导入
BulkRequest bulkRequest=new BulkRequest();

//2.1 循环goodsList,创建IndexRequest添加数据
for (Goods goods : goodsList) {
    //2.2 设置spec规格信息 Map的数据   specStr:{}
    String specStr = goods.getSpecStr();
    //将json格式字符串转为Map集合
    Map map = JSON.parseObject(specStr, Map.class);
    //设置spec map
    goods.setSpec(map);
    //将goods对象转换为json字符串
    String data = JSON.toJSONString(goods);
    IndexRequest indexRequest=new IndexRequest("goods").source(data,XContentType.JSON);
    bulkRequest.add(indexRequest);
}
BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(response.status());

二、高级查询操作

1、matchAll查询

脚本:

GET goods/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 20
}

java:

//构建查询请求对象,指定查询的索引名称
SearchRequest searchRequest=new SearchRequest("goods");
//创建查询条件构建器SearchSourceBuilder
SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();
//查询条件
QueryBuilder queryBuilder= QueryBuilders.matchAllQuery();
//指定查询条件
sourceBuilder.query(queryBuilder);
//添加分页信息  不设置 默认10条
sourceBuilder.from(0);
sourceBuilder.size(20);
//添加查询条件构建器 SearchSourceBuilder
searchRequest.source(sourceBuilder);
//查询,获取查询结果
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//1、获取命中对象 SearchHits
SearchHits hits = searchResponse.getHits();
//1.1 获取总记录数
Long total= hits.getTotalHits().value;
System.out.println("总数:"+total);
//1.2 获取Hits数据  数组
SearchHit[] hits1 = hits.getHits();
//获取json字符串格式的数据
List<Goods> goodsList = new ArrayList<>();
for (SearchHit searchHit : hits1) {
    String sourceAsString = searchHit.getSourceAsString();
    //转为java对象
    Goods goods = JSON.parseObject(sourceAsString, Goods.class);
    goodsList.add(goods);
}
for (Goods goods : goodsList) {
    System.out.println(goods);
}

2、termQuery词条查询

term查询:不会对查询条件进行分词。

脚本:

GET goods/_search
{
  "query": {
    "term": {
      "title": {
        "value": "华为"
      }
    }
  }
}

java:

//构建查询请求对象,指定查询的索引名称
SearchRequest searchRequest=new SearchRequest("goods");
//创建查询条件构建器SearchSourceBuilder
SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();
//查询条件
QueryBuilder queryBuilder= QueryBuilders.termQuery("title","华为");
//指定查询条件
sourceBuilder.query(queryBuilder);
//添加查询条件构建器 SearchSourceBuilder
searchRequest.source(sourceBuilder);
//查询,获取查询结果
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

3、matchQuery查询

match查询:

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

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

•默认取并集(OR),也可指定交集(AND)

脚本:

GET goods/_search
{
  "query": {
    "match": {
      "title": {
                "query": "华为手机",
                "operator": "and"
        }
    }
  }
}

 java:

//构建查询请求对象,指定查询的索引名称
SearchRequest searchRequest=new SearchRequest("goods");
//创建查询条件构建器SearchSourceBuilder
SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();
//查询条件
MatchQueryBuilder queryBuilder= QueryBuilders.matchQuery("title","华为");
queryBuilder.operator(Operator.AND);
//指定查询条件
sourceBuilder.query(queryBuilder);
//添加查询条件构建器 SearchSourceBuilder
searchRequest.source(sourceBuilder);
//查询,获取查询结果
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

4、模糊查询

脚本:

(1)wildcard查询

"*华*"  包含华字的
"华*"   华字后边多个字符
"华?"  华字后边1个字符
"*华"或"?华" 会引发全表(全索引)扫描 注意效率问题

GET goods/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "华*"
      }
    }
  }
}

(2)正则查询

GET goods/_search
{
  "query": {
    "regexp": {
      "title": "\\w+(.)*"
    }
  }
}

(3)前缀查询

GET goods/_search
{
  "query": {
    "prefix": {
      "brandName": {
        "value": "三"
      }
    }
  }
}

java:

//模糊查询
WildcardQueryBuilder query = QueryBuilders.wildcardQuery("title", "华*");//华后多个字符
//正则查询
RegexpQueryBuilder query = QueryBuilders.regexpQuery("title", "\\w+(.)*");
//前缀查询
PrefixQueryBuilder query = QueryBuilders.prefixQuery("brandName", "三");

 5、范围与排序查询

脚本:

GET goods/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 2000,
        "lte": 3000
      }
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

java:

//范围查询 以price 价格为条件
RangeQueryBuilder query = QueryBuilders.rangeQuery("price");

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

sourceBuilder.query(query);

//排序  价格 降序排列
sourceBuilder.sort("price",SortOrder.DESC);

6、queryString多字段查询

queryString 多条件查询

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

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

•默认取并集(OR)

•可以指定多个查询字段

query_string:识别query中的连接符(or 、and)

GET goods/_search
{
  "query": {
    "query_string": {
      "fields": ["title","categoryName","brandName"], 
      "query": "华为 AND 手机"
    }
  }
}

simple_query_string:不识别query中的连接符(or 、and),查询时会将 “华为”、"and"、“手机”分别进行查询

GET goods/_search
{
  "query": {
    "simple_query_string": {
      "fields": ["title","categoryName","brandName"], 
      "query": "华为 AND 手机"
    }
  }
}

java:

QueryStringQueryBuilder query = QueryBuilders.queryStringQuery("华为手机").field("title").field("categoryName")
.field("brandName").defaultOperator(Operator.AND);

7、布尔查询

boolQuery:对多个查询条件连接。连接方式:

•must(and):条件必须成立

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

•should(or):条件可以成立

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

得分:即条件匹配度,匹配度越高,得分越高

GET goods/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "brandName": {
              "value": "华为"
            }
          }
        }
      ],
      "filter":[ 
        {
        "term": {
          "title": "手机"
        }
       },
       {
         "range":{
             "price": {
                "gte": 2000,
                "lte": 3000
             }
         }
       }
      ]
    }
  }
}

java:

//1.构建boolQuery
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//2.构建各个查询条件
//2.1 查询品牌名称为:华为
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("brandName", "华为");
boolQuery.must(termQueryBuilder);
//2.2. 查询标题包含:手机
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("title", "手机");
boolQuery.filter(matchQuery);
//2.3 查询价格在:2000-3000
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("price");
rangeQuery.gte(2000);
rangeQuery.lte(3000);
boolQuery.filter(rangeQuery);
sourceBuilder.query(boolQuery);

 8、聚合查询

指标聚合:相当于MySQL的聚合函数。max、min、avg、sum等

桶聚合:相当于MySQL的 group by 操作。不要对text类型的数据进行分组,会失败。

//指标聚合 聚合函数

GET goods/_search
{
  "query": {
    "match": {
      "title": "手机"
    }
  },
  "aggs": {
    "max_price": {
      "max": {
        "field": "price"
      }
    }
  }
}

//桶聚合  分组

GET goods/_search
{
  "query": {
    "match": {
      "title": "手机"
    }
  },
  "aggs": {
    "goods_brands": {
      "terms": {
        "field": "brandName",
        "size": 100
      }
    }
  }
}

java:

/**
* 聚合查询:桶聚合,分组查询
* 1. 查询title包含手机的数据
* 2. 查询品牌列表
*/
//1. 查询title包含手机的数据
MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "手机");
sourceBuilder.query(queryBuilder);
//2. 查询品牌列表  只展示前100条
AggregationBuilder  
    aggregation=AggregationBuilders.terms("goods_brands").field("brandName").size(100);
sourceBuilder.aggregation(aggregation);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//7. 获取命中对象 SearchHits
SearchHits hits = searchResponse.getHits();
//7.1 获取总记录数
Long total= hits.getTotalHits().value;
System.out.println("总数:"+total);
// aggregations 对象
Aggregations aggregations = searchResponse.getAggregations();
//将aggregations 转化为map
Map<String, Aggregation> aggregationMap = aggregations.asMap();
//通过key获取goods_brands 对象 使用Aggregation的子类接收  buckets属性在Terms接口中体现
//Aggregation goods_brands1 = aggregationMap.get("goods_brands");
Terms goods_brands =(Terms) aggregationMap.get("goods_brands");
//获取buckets 数组集合
List<? extends Terms.Bucket> buckets = goods_brands.getBuckets();
Map<String,Object>map=new HashMap<>();
//遍历buckets   key 属性名,doc_count 统计聚合数
for (Terms.Bucket bucket : buckets) {
    System.out.println(bucket.getKey());
    map.put(bucket.getKeyAsString(),bucket.getDocCount());
}
System.out.println(map);

9、高亮查询

高亮三要素:

•高亮字段

•前缀

•后缀

默认前后缀 :em

GET goods/_search
{
  "query": {
    "match": {
      "title": "电视"
    }
  },
  "highlight": {
    "fields": {
      "title": {
        "pre_tags": "<font color='red'>",
        "post_tags": "</font>"
      }
    }
  }
}

java:1. 设置高亮 高亮字段 前缀 后缀   2. 将高亮了的字段数据,替换原有数据

// 1. 查询title包含手机的数据
    MatchQueryBuilder query = QueryBuilders.matchQuery("title", "手机");

    sourceBulider.query(query);

    //设置高亮
    HighlightBuilder highlighter = new HighlightBuilder();
    //设置三要素
    highlighter.field("title");
    //设置前后缀标签
    highlighter.preTags("<font color='red'>");
    highlighter.postTags("</font>");

    //加载已经设置好的高亮配置
    sourceBulider.highlighter(highlighter);

    searchRequest.source(sourceBulider);

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


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

    List<Goods> goodsList = new ArrayList<>();
    SearchHit[] hits = searchHits.getHits();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();

        //转为java
        Goods goods = JSON.parseObject(sourceAsString, Goods.class);

        // 获取高亮结果,替换goods中的title
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        HighlightField HighlightField = highlightFields.get("title");
        Text[] fragments = HighlightField.fragments();
        //highlight title替换 替换goods中的title
        goods.setTitle(fragments[0].toString());
        goodsList.add(goods);
    }

    for (Goods goods : goodsList) {
        System.out.println(goods);
    }

10、给索引起别名

例如:给 student_index_v2 起别名 student_index_v11 

POST student_index_v2/_alias/student_index_v11文章来源地址https://www.toymoban.com/news/detail-414522.html

到了这里,关于ElasticSearch高级操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch中批量操作(批量查询_mget、批量插入删除_bulk)

    有时候可以通过批量操作来减少网络请求。如:批量查询、批量插入数据。 当某一条数据不存在,不影响整体响应,需要通过found的值进行判断是否查询到数据。          在Elasticsearch中,支持批量的插入、修改、删除操作,都是通过_bulk的api完成的。 请求格式如下:(

    2024年02月12日
    浏览(50)
  • Elasticsearch初识之索引的批量操作

    批量查询和批量增删改 批量查询 批量写入: 注意: bulk api对json的语法有严格的要求,除了delete外,每一个操作都要两个json串(metadata和business data),且每个json串内不能换行,非同一个json串必须换行,否则会报错; bulk操作中,任意一个操作失败,是不会影响其他的操作的

    2024年02月02日
    浏览(42)
  • Java API批量操作Elasticsearch

    @Test public void batchAddIndex() throws IOException { BulkRequestBuilder bulkRequest = client .prepareBulk(); bulkRequest.add( client .prepareIndex( “batch_test1” , “batch” , “1” ) .setSource( jsonBuilder () .startObject() .field( “user” , “lzq” ) .field( “postDate” , new Date()) .field( “message” , “trying out Elasticsearch”

    2024年04月09日
    浏览(45)
  • Elasticsearch各种高级文档操作

    本文来记录下Elasticsearch各种文档操作 在进行各种文档操作之前,我们先进行初始化文档数据的工作 在 apifox 中,向 ES 服务器发 GET请求 :http://localhost:9200/person/_search,请求体内容为: 请求提参数解释 参数 解释 query 代表一个查询对象,里面可以有不同的查询属性 match_all 查

    2024年01月21日
    浏览(31)
  • ElasticSearch高级操作

    1、脚本形式 例: #删除5号 #新增8号 #更新2号 name为2号 2、java操作  3、从数据库写入数据 1、matchAll查询 脚本: java: 2、termQuery词条查询 term查询:不会对查询条件进行分词。 脚本: java: 3、matchQuery查询 match查询: •会对查询条件进行分词。 •然后将分词后的查询条件和词

    2023年04月15日
    浏览(31)
  • Elasticsearch各种高级文档操作3

    本文来记录几种Elasticsearch的文档操作 在进行各种文档操作之前,我们先进行初始化文档数据的工作 聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值、平均值等等。 在 apifox 中,向 ES 服务器发 GET请求 :ht

    2024年01月21日
    浏览(28)
  • Elasticsearch各种高级文档操作2

    本文来记录下Elasticsearch各种文档操作 在进行各种文档操作之前,我们先进行初始化文档数据的工作 match 模糊查询返回包含与搜索字词相似的字词的文档。 编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括: 操作 示例 更改字符 (box →

    2024年01月21日
    浏览(76)
  • 七、ElasticSearch-高级查询操作三

    在进行搜索时,搜索出的内容中的会显示不同的颜色,称之为高亮。 Elasticsearch 可以对查询内容中的部分,进行标签和样式 ( 高亮 ) 的设置。 在使用 match 查询的同时,加上一个 highlight 属性: pre_tags :前置标签 post_tags :后置标签 fields :需要高亮的字段

    2023年04月08日
    浏览(33)
  • Elasticsearch学习--索引的批量操作mget、bulk

    1. 基本用法 查询id是1、2的数据 2. 提取index  3. ids的用法 4. 指定source create:不存在则创建,存在则报错 delete:删除文档 update:全量替换或部分更新 index:索引(动词) 1. 自动生成id   2. 删除操作是懒删除 并没有真正的删除,只是标记为删除  3. index(可以是创建,也可以

    2024年02月10日
    浏览(55)
  • Elasticsearch入门之Http操作(高级查询)

    Http操作: 高级查询: 高级查询:Elasticsearch 提供了基于 JSON 提供完整的查询 DSL 来定义查询 初始化数据: 查询所有文档: 在 Postman 中,向 ES 服务器发 GET 请求 :http://172.18.20.254:9200/shopping/_search 返回值: 返回值解释: 匹配查询: match 匹配类型查询,会把查询条件进行分词

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包