Elasticsearch入门指南(二)

[复制链接]
发表于 2025-9-29 13:35:20 | 显示全部楼层 |阅读模式
一、RestClient利用索引库

什么是RestClient?
ES官方提供了各种差别语言的客户端,用来利用ES。这些客户端的本质就是组装DSL语句,通过http哀求发送给ES。官方文档所在: https://www.elastic.co/guide/en/elasticsearch/client/index.html
案例:使用 JavaRestClient 实现创建、删除索引库,判断索引库是否存在
根据课前资料提供的旅馆数据创建索引库,索引库名为hotel,mapping属性根据数据库结构界说。
准备步调如下:

  • 导入课前资料Demo

  • 分析数据结构,界说mapping属性
小提示

  • ES中支持两种地理坐标数据范例:

    • geo_point:由纬度(latitude) 和经度(longitude)确定的一个点。比方:“32.8752345, 120.2981576”
    • geo_shape:有多个geo_point构成的复杂多少图形。比方一条直线,“LINESTRING (-77.03653 38.897676, -77.009051 38.889939)”

  • 字段拷贝可以使用copy_to属性将当前字段拷贝到指定字段。示例:
  1. "all": {
  2.     "type": "text",
  3.     "analyzer": "ik_max_word"
  4. },
  5. "brand": {
  6.     "type": "keyword",
  7.     "copy_to": "all"
  8. }
复制代码
3. 初始化JavaRestClient
现实步调

1.引入es的RestHighLevelClient依靠:
  1. <dependency>
  2.     <groupId>org.elasticsearch.client</groupId>
  3.     <artifactId>elasticsearch-rest-high-level-client</artifactId>
  4. </dependency>
复制代码

  • 由于SpringBoot默认的ES版本7.6.2,以是我们须要覆盖默认的ES版本
  1. <properties>
  2.     <java.version>1.8</java.version>
  3.     <elasticsearch.version>7.12.1</elasticsearch.version>
  4. </properties>
复制代码

  • 初始化RestHighLevelClient:
  1. RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
  2.   HttpHost.create("http://192.168.150.101:9200")
  3. ));
复制代码

4. 使用JavaRestClient创建索引库

5. 使用JavaRestClient删除索引库
  1. @Test
  2. void testDeleteIndex() throws IOException {
  3.     // 1.准备Request
  4.     DeleteIndexRequest request = new DeleteIndexRequest("hotel");
  5.     // 2.发送请求
  6.     client.indices().delete(request, RequestOptions.DEFAULT);
  7. }
复制代码
6.使用JavaRestClient判断索引库是否存在
  1. @Test
  2. void testExistsIndex() throws IOException {
  3.     // 1.准备Request
  4.     GetIndexRequest request = new GetIndexRequest("hotel");
  5.     // 2.发送请求
  6.     boolean isExists = client.indices().exists(request, RequestOptions.DEFAULT);
  7.     System.out.println(isExists ? "存在" : "不存在");
  8. }
复制代码
二、RestClient利用文档

案例1:使用JavaRestClient实现文档的CRUD

数据库查询旅馆数据,导入到hotel索引库,实现旅馆数据的CRUD。
根本步调如下:

  • 初始化JavaRestClient
  • 使用JavaRestClient 新增旅馆数据
    3. 使用JavaRestClient 根据id查询旅馆数据

  • 使用JavaRestClient 删除旅馆数据
  1. @Test
  2. void testDeleteDocumentById() throws IOException {
  3.     // 1.准备Request      // DELETE /hotel/_doc/{id}
  4.     DeleteRequest request = new DeleteRequest("hotel", "61083");
  5.     // 2.发送请求
  6.     client.delete(request, RequestOptions.DEFAULT);
  7. }
复制代码

  • 使用JavaRestClient 修改旅馆数据

案例2:使用JavaRestClient批量导入旅馆数据到ES

需求:批量查询旅馆数据,然后批量导入索引库中
思绪:

  • 使用mybatis-plus查询旅馆数据
  • 将查询到的旅馆数据(Hotel) 转换为文档范例数据(HotelDoc)
  • 使用JavaRestClient中 的Bulk批处置处罚,实现批量新增文档,示例代码如下
  1. @Test
  2. void testBulkRequest() throws IOException {
  3.     // 查询所有的酒店数据
  4.     List<Hotel> list = hotelService.list();
  5.     // 1.准备Request
  6.     BulkRequest request = new BulkRequest();
  7.     // 2.准备参数
  8.     for (Hotel hotel : list) {
  9.         // 2.1.转为HotelDoc
  10.         HotelDoc hotelDoc = new HotelDoc(hotel);
  11.         // 2.2.转json
  12.         String json = JSON.toJSONString(hotelDoc);
  13.         // 2.3.添加请求
  14.         request.add(new IndexRequest("hotel").id(hotel.getId().toString()).source(json, XContentType.JSON));
  15.     }
  16.     // 3.发送请求
  17.     client.bulk(request, RequestOptions.DEFAULT);
  18. }
复制代码
三、DSL查询

查询语法
  1. GET /hotel/_search
  2. {
  3.   "query": {
  4.       "match_all": {}  
  5.   },
  6.    "from": 10, #默认0
  7.    "size": 20, #默认10
  8.    "sort": {
  9.       "price": "asc"  
  10.    },
  11.    "highlight": {
  12.       "fields": {
  13.          "name": {
  14.            "require_field_match": "false",
  15.            "pre_tags": "<en>",
  16.            "post_tags": "</en>"
  17.         }
  18.       }
  19.    },
  20.    "aggs": {
  21.       "brandAgg":{
  22.           "terms": {
  23.             "field": "brand",
  24.             "order": {
  25.               "_count": "asc"
  26.             },
  27.             "size": 20
  28.           }
  29.       }
  30.   }
  31. }
复制代码
DSL Query的分类
查询根本语法如下:

Elasticsearch提供了基于JSON的DSL (Domain Specific Language)来界说查询。常见的查询范例包罗:


  • 查询全部:查询出全部数据,一样平常测试用。比方: match_all
  • 全文检索(full text)查询:使用分词器对用户输入内容分词,然后去倒排索引库中匹配。比方:

    • match_query
    • multi_match_query

  • 正确查询:根据正确词条值查找数据,一样平常是查找 keyword、数值、日期、boolean等范例字段。比方:

    • ids
    • range
    • term

  • 地理(geo)查询:根据经纬度查询。比方:

    • geo_distance
    • geo_bounding_box

  • 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,归并查询条件。比方:

    • bool
    • function_score

查询全部 match_all



  • 查询全部不消写条件
  • 查询出的效果不会列出全部数据,默认只表现前10条

全文检索查询 match/multi_match


Q:match 和 multi_match 的区别是什么?


  • match:根据一个字段查询
  • multi_match:根据多个字段查询,参加查询字段越多,查询性能越差
正确查询: term/range

正确查询不会对搜刮条件分词
正确查询常见的有哪些?


  • term查询:根据词条正确匹配,一样平常搜刮keyword范例、数值范例、布尔范例、日期范例字段
  • range查询:根据数值范围查询,可以是数值、日期的范围。可以写gt(大于、gte(大于便是、lt(小于、lte(小于便是

    示例:查询品牌是【如家】和代价区间在【2000-3000】内的旅馆

地理查询: geo_bounding_box\geo_distance

根据经纬度查询。常见的使用场景包罗:


  • 携程:搜刮我附近的旅馆
  • 滴滴:搜刮我附近的出租车
  • 微信:搜刮我附近的人


    示例:查询(31.21,121.5)附近2km内的旅馆

复合查询 functions

复合(compound)查询:复合查询可以将别的简朴查询组合起来,实现更复杂的搜刮逻辑,比方:


  • fuction score:算分函数查询
    可以控制文档干系性算分,控制文档排名。比方百度竞价

elasticsearch中的干系性打分算法是什么?


  • TF-IDF:在elasticsearch5.0之前, 会随着词频增长而越来越大
  • BM25:在elasticsearch5.0之后, 会随着词频增长而增大,但增长曲线会趋于水平

案例:给“如家”这个品牌的旅馆排名靠前一些

复合查询–Boolean Query


案例

四、搜刮效果处置处罚

排序

elasticsearch支持对搜刮效果排序,默认是根据干系度算分(_score) 来排序。可以排序字段范例有:keyword范例、数值范例、地理坐标范例、日期范例等。
示例:

分页

elasticsearch默认环境下只返回top10的数据。而假如要查询更多数据就须要修改分页参数了。
elasticsearch中通过修改from、size参数来控制要返回的分页效果:

深度分页标题


常见分页方式


  • from + size:

    • 优点:支持随机翻页
    • 缺点:深度分页标题,默认查询上限(from+ size)是10000
    • 场景:百度、京东、谷歌、淘宝如许的随机翻页搜刮

  • search after (官方保举):分页时须要排序,原理时从上一次的排序值开始,查询下一页数据。

    • 优点:没有查询上限(单次查询的size不凌驾10000 )
    • 缺点:只能向后逐页查询,不支持随机翻页
    • 场景:没有随机翻页需求的搜刮,比方手机向下滚动翻页

  • scroll: 原理将排序数据形成快照,生存在内存

    • 优点:没有查询上限(单次查询的size不凌驾10000)
    • 缺点:会有额外内存斲丧,而且搜刮效果黑白实时的
    • 场景:海量数据的获取和迁徙。从ES7.1开始不保举,发起用search after方案。

高亮

高亮:就是在搜刮效果中把搜刮关键字突出表现。
原理是如许的:


  • 将搜刮效果中的关键字用标签标志出来
  • 在页面中给标签添加css样式
    tip:默认环境下,es搜刮字段和高亮字段同等才会高亮。高亮效果标签默认是em


五、RestClient 查询文档

快速入门



match_all查询

查询效果分析

全文检索查询




排序和分页

链式编程


高亮表现



高亮效果分析

高亮效果与查询效果_source同级,而且高亮效果是个数组(大概不止一处高亮)

实用案例

搜刮中给某品牌增长算分


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表