当前位置: 首页 > article >正文

Elasticsearch JavaRestClient版

文章目录

    • 初始化RestHighLeveClient(必要条件)
    • 索引库操作
        • 1.创建索引库(4步)
        • 2.删除索引库(3步)
        • 3.判断索引库是否存在(3步)
        • 4.总结:四步走
    • 文档操作
        • 1.创建文档(4步)
        • 2.删除文档(3步)
        • 3.查看文档(4步)
        • 4.增量修改文档(局部更新)(4步)
        • 5.批量创建文档(4步)
        • 6.总结:五步走
    • Elasticsearch查询语法
        • 1.全文检索(5步)
          • match_all
          • match
          • multi_match
        • 2.精确查找
          • term
          • range
        • 3.复合查询
          • Bool Query(5步)
          • function score(广告置顶)
        • 排序(sort)
        • 分页(from/size)
        • 高亮(highlight)
        • 总结

初始化RestHighLeveClient(必要条件)

<!--Maven配置-->
<!--引入es的RestHignLeveClient依赖-->
<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
<!--因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本:-->
<properties>
  <java.version>1.8</iava.version>
  <elasticsearch,version>7.12.1</elasticsearch.version>
</properties>


//1.初始化RestHighLeveClient
RestHighLeveClient client = new RestHighLeveClient(RestClient.builder(
      //写自己的ES地址
      HttpHost.create("localhost:9200");
))

索引库操作

1.创建索引库(4步)
//2.相当于 PUT /索引名
CreateIndexRequest request = new CreateIndexRequest("索引库名");
//3.相当于请求体JSON风格
request.source("请求体",XContentType.JSON);
//4.发起请求.indices()包含索引库操作的的所有方法
client.indices().create(request,RequestOptions.DEFAULT);
2.删除索引库(3步)
// 2.相当于 DELETE /索引库名
DeleteIndexRequest request = new DeleteIndexRequest("索引库名");

//3.发起请求
client.indices().create(request,RequestOptions.DEFAULT);
3.判断索引库是否存在(3步)
// 2.相当于 GET /索引库名
GetIndexRequest request = new GetIndexRequest("索引库名称");

// 3.发起请求
boolean exists = client.indices.exists(request,RequestOptions.DEFAULT);

//输出查看是否存在,是为true,不是为false
System.out.println(exists);
4.总结:四步走

从这里可以看出,创建索引有四步,其余只有三步

文档操作

1.创建文档(4步)
// 2.相当于POST /索引库名/_doc/文档id
IndexRequest request = new IndexRequest("索引库名").id("文档id");
// 3.准备json文档,也就是文档的内容,请求体
request.source("请求体",XContentType.JSON);
// 4.发送请求
client.index(request,RequestOptions.DEFAULT);

/**注意:
*如果是请求体是实体对象,请序列化成JSON.toJSONString(请求体)
*文档id在ES默认是keyword,在java中也就是String类型,需要toString()转成字符串
*/
2.删除文档(3步)
// 2.相当于 DELETE /索引库名/_doc/文档id
DeleteRequest request = new DeleteRequest("索引库名","文档id");
// 3.发送请求
client.delete(request,RequestOptions.DEFAULT);
3.查看文档(4步)
// 2.相当于 GET /索引库名/_doc/文档id
GetRequest request = new GetRequest("索引库名","文档id");
// 3.发送请求
GetResponse response = client.get(request,RequestOptions.DEFAULT)
// 4.解析结果
String json = response.getSourceAsString();
System.out.println(json)
4.增量修改文档(局部更新)(4步)
// 2.相当于 POST /索引库名/ _update/文档id
UpdateRequest request = new UpdateRequest("indexName","文档id");

// 3.准备参数
request.doc(
      "age":18,
      "name":"Rose"
)
// 4.更新文档
client.update(request,RequestOptions.DEFAULT)
5.批量创建文档(4步)
// 2.创建Bulk请求
BulkRequest request = new BulkRequest();
// 3.准备参数,添加多个IndexRequest(),以实体类为例
for(Student student:students){
  Student student = new Student();
  request.add(new IndexRequest("索引库名")
          .id(student.getId())
          .source(JSON.toJSONString(student),XContentType.JSON);)
}
// 4.发送请求
client.bulk(request,RequestOptions.DEFAULT)
6.总结:五步走

Elasticsearch查询语法

1.全文检索(5步)
match_all
// match_all
// 2.准备request
SearchRequest request = new SearchRequest("索引库名");
// 3.组织DSL参数
request.source.query(QueryBuilders.matchAll());
// 4.发送请求,得到结果
SearchResponse response = client.search(request,RequestOptions.DEFAULT);

// 5.解析响应结果
SearchHits searchHits = response.getHits();
// 5.1获取总条数
long total = searchHits.getTotalHits().value;
// 5.2获取文档数组并且遍历
SearHits[] hits = searchHits.getHits();
for(SearchHits hit : hits){
  //获取文档数据源
  String json = hit.getSourceAaString();
  //反序列化
  HoteDoc hotelDoc = JSON.parseObject(json,HoteDoc.class);
}

System.out.println(response);
match
//在match_all第5行修改
QueryBuilders.matchQuery("要查询的字段","查询的内容");
multi_match
//在match_all第5行修改
QueryBuilders.multiMatchQuery("要查询的内容","被查询的字段","被查询的字段");
2.精确查找
term
//在match_all第5行修改
QueryBuilders.termQuery("查询字段","被查询的内容")
range
//在match_all第5行修改
QueryBuilders.rangeQuery("被查询字段").get(100).lte(150)
3.复合查询
Bool Query(5步)
// 2.准备request
SearchRequest request = new SearchRequest("索引库名");
// 3.复合条件
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must();
boolQuery.filter();
// 3.1组织DSL参数
request.source.query(boolQuery);
// 4.发送请求,得到结果
SearchResponse response = client.search(request,RequestOptions.DEFAULT);

// 5.解析结果

function score(广告置顶)
// 2.准备request
SearchRequest request = new SearchRequest("索引库名");

// 3.复合条件
FunctionScoreQueryBuilder functionScoreQuery = 
        QueryBuilders.functionScoreQuery(
            //原始查询
            QueryBuilders.matchAll();
            //function
            new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                    //过滤条件
                    QueryBuilders.termQuery("查询字段","被查询的内容")
                    //算分函数
                    ScoreFunctionBuilders.weightFactorFunction(10)
            )
        )
// 3.1组织DSL参数
request.source.query(functionScoreQuery);

// 4.发送请求,得到结果
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
排序(sort)
// 普通字段排序
request.source.sort("要排序的字段",排序方式);

// 地理坐标距离排序
request.source.sort(SortBuilders
          .geoDistanceSort("geo_point类型字段",new GeoPoint("经度,纬度"))
          .order(SortOrder.ASC)
          .unit(DistanceUnit.KILOMETERS)
)
分页(from/size)
request.source.from(0).size(5);
高亮(highlight)
// 2.准备request
SearchRequest request = new SearchRequest("索引库名");
// 3.准备DSL查询出来的字段
request.source.query(QueryBuilders.matchQuery("要查询的字段","查询的内容"))
// 3.1对查询出来的字段高亮显示
request.source.highlighter(new HighlightBuilder().field("要高亮的字段")
              .requireFieldMatch(false)//是否需要与查询字段匹配
)
// 4.发送请求
SearchResponse response = client.search(request,RequestOptions.DEFAULT);

//高亮结果的处理
// 5.解析响应结果
SearchHits searchHits = response.getHits();
// 5.1获取总条数
long total = searchHits.getTotalHits().value;
// 5.2获取文档数组并且遍历
SearHits[] hits = searchHits.getHits();
for(SearchHits hit : hits){
  //获取文档数据源
  String json = hit.getSourceAaString();
  //反序列化
  HoteDoc hotelDoc = JSON.parseObject(json,HoteDoc.class);
  //获取高亮结果
  Map<String,HighlightField> highlightFields = hit.getHighlightFields();
  if(!CollectionUtils.isEmpty(highlightFields)){
    //根据字段获取高亮结果
    HighlightFields highlightField = highlightFields.get("name");
    if(highlightField != null){
      highlightField.getFragments()[0].string();
      hotelDoc.setName(name);
    }
  }
}
总结


http://www.kler.cn/a/465273.html

相关文章:

  • 对计网大题的一些指正(中间介绍一下CDM的原理和应用)
  • 数据看板如何提升决策效率?
  • 我的创作之路:从 Python 爱好者到创作者的蜕变
  • 让私域用户付费的三个关键要素
  • STM32完全学习——使用定时器1精确延时
  • 2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无
  • SQL 中索引分析,查询表索引
  • 滑雪护目镜欧盟CE认证EN 174测试标准
  • 在正则表达式中,\1 是用来引用第一个捕获组的内容的。捕获组是用括号 () 包裹的部分
  • Linux下卸载与安装JDK
  • 流体神经网络简介
  • 使用爬虫代理做采集数据时,要注意什么?
  • 【84键矮轴无线键盘】个人使用经历
  • 使用Sass封装倍图混合器
  • Matlab全局变量用法及其实例分析
  • 前端-工具总结
  • 2025/1/1 路由期末复习作业二
  • 阿里云DDoS攻击后的恢复时间分析
  • ocp认证考试注意事项以及费用详情
  • JVM之后端编译
  • Elasticsearch及ELK使用(四):与数据库DB交互
  • VueRouter之props参数
  • dockerfile中su命令如何切换用户激活环境,报错su: invalid option -- ‘n‘
  • 【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)
  • coredns报错plugin/forward: no nameservers found
  • QT-------------多线程