您的位置:首页 > 房产 > 建筑 > 国内外包平台_个人网站备案需要几天_软文营销模板_百度在线客服人工服务

国内外包平台_个人网站备案需要几天_软文营销模板_百度在线客服人工服务

2025/4/18 14:58:28 来源:https://blog.csdn.net/qq_45438032/article/details/147087439  浏览:    关键词:国内外包平台_个人网站备案需要几天_软文营销模板_百度在线客服人工服务
国内外包平台_个人网站备案需要几天_软文营销模板_百度在线客服人工服务

一、RestClient操作索引库

什么是RestClient?
ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址: https://www.elastic.co/guide/en/elasticsearch/client/index.html

案例:利用 JavaRestClient 实现创建、删除索引库,判断索引库是否存在
根据课前资料提供的酒店数据创建索引库,索引库名为hotel,mapping属性根据数据库结构定义。

准备步骤如下:

  1. 导入课前资料Demo
    在这里插入图片描述
  2. 分析数据结构,定义mapping属性
    小提示
  3. ES中支持两种地理坐标数据类型:
  • geo_point:由纬度(latitude) 和经度(longitude)确定的一个点。例如:“32.8752345, 120.2981576”
  • geo_shape:有多个geo_point组成的复杂几何图形。例如一条直线,“LINESTRING (-77.03653 38.897676, -77.009051 38.889939)”
  1. 字段拷贝可以使用copy_to属性将当前字段拷贝到指定字段。示例:
"all": {"type": "text","analyzer": "ik_max_word"
},
"brand": {"type": "keyword""copy_to": "all"
}

在这里插入图片描述3. 初始化JavaRestClient

实际步骤
1.引入es的RestHighLevelClient依赖:

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
  1. 因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本:
<properties><java.version>1.8</java.version><elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
  1. 初始化RestHighLevelClient:
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.150.101:9200")
));

在这里插入图片描述
4. 利用JavaRestClient创建索引库
在这里插入图片描述
5. 利用JavaRestClient删除索引库

@Test
void testDeleteIndex() throws IOException {// 1.准备RequestDeleteIndexRequest request = new DeleteIndexRequest("hotel");// 2.发送请求client.indices().delete(request, RequestOptions.DEFAULT);
}

6.利用JavaRestClient判断索引库是否存在

@Test
void testExistsIndex() throws IOException {// 1.准备RequestGetIndexRequest request = new GetIndexRequest("hotel");// 2.发送请求boolean isExists = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(isExists ? "存在" : "不存在");
}

二、RestClient操作文档

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

去数据库查询酒店数据,导入到hotel索引库,实现酒店数据的CRUD。
基本步骤如下:

  1. 初始化JavaRestClient

  2. 利用JavaRestClient 新增酒店数据
    在这里插入图片描述 3. 利用JavaRestClient 根据id查询酒店数据
    在这里插入图片描述

  3. 利用JavaRestClient 删除酒店数据

@Test
void testDeleteDocumentById() throws IOException {// 1.准备Request      // DELETE /hotel/_doc/{id}DeleteRequest request = new DeleteRequest("hotel", "61083");// 2.发送请求client.delete(request, RequestOptions.DEFAULT);
}
  1. 利用JavaRestClient 修改酒店数据
    在这里插入图片描述

案例2:利用JavaRestClient批量导入酒店数据到ES

需求:批量查询酒店数据,然后批量导入索引库中
思路:

  1. 利用mybatis-plus查询酒店数据
  2. 将查询到的酒店数据(Hotel) 转换为文档类型数据(HotelDoc)
  3. 利用JavaRestClient中 的Bulk批处理,实现批量新增文档,示例代码如下
@Test
void testBulkRequest() throws IOException {// 查询所有的酒店数据List<Hotel> list = hotelService.list();// 1.准备RequestBulkRequest request = new BulkRequest();// 2.准备参数for (Hotel hotel : list) {// 2.1.转为HotelDocHotelDoc hotelDoc = new HotelDoc(hotel);// 2.2.转jsonString json = JSON.toJSONString(hotelDoc);// 2.3.添加请求request.add(new IndexRequest("hotel").id(hotel.getId().toString()).source(json, XContentType.JSON));}// 3.发送请求client.bulk(request, RequestOptions.DEFAULT);
}

三、DSL查询

查询语法

GET /hotel/_search
{"query": {"match_all": {}  },"from": 10, #默认0"size": 20, #默认10"sort": {"price": "asc"  },"highlight": {"fields": {"name": {"require_field_match": "false","pre_tags": "<en>","post_tags": "</en>"}}},"aggs": {"brandAgg":{"terms": {"field": "brand","order": {"_count": "asc"}, "size": 20}}}
}

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

在这里插入图片描述

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中通过修改fromsize参数来控制要返回的分页结果:
在这里插入图片描述

深度分页问题

在这里插入图片描述

常见分页方式

  1. from + size
  • 优点:支持随机翻页
  • 缺点深度分页问题,默认查询上限(from+ size)是10000
  • 场景:百度、京东、谷歌、淘宝这样的随机翻页搜索
  1. search after (官方推荐):分页时需要排序,原理时从上一次的排序值开始,查询下一页数据。
  • 优点:没有查询上限(单次查询的size不超过10000 )
  • 缺点:只能向后逐页查询,不支持随机翻页
  • 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
  1. scroll: 原理将排序数据形成快照,保存在内存
  • 优点:没有查询上限(单次查询的size不超过10000)
  • 缺点:会有额外内存消耗,并且搜索结果是非实时
  • 场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议用search after方案。

高亮

高亮:就是在搜索结果中把搜索关键字突出显示
原理是这样的:

  • 将搜索结果中的关键字用标签标记出来
  • 在页面中给标签添加css样式
    tip:默认情况下,es搜索字段和高亮字段一致才会高亮。高亮结果标签默认是em
    在这里插入图片描述
    在这里插入图片描述

五、RestClient 查询文档

快速入门

在这里插入图片描述
在这里插入图片描述
match_all查询
在这里插入图片描述
查询结果解析
在这里插入图片描述

全文检索查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

排序和分页

链式编程
在这里插入图片描述
在这里插入图片描述

高亮显示

在这里插入图片描述
在这里插入图片描述

高亮结果解析

高亮结果与查询结果_source同级,而且高亮结果是个数组(可能不止一处高亮)
在这里插入图片描述

实用案例

搜索中给某品牌增加算分
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com