一、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属性将当前字段拷贝到指定字段。示例:
- "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>
复制代码
- 由于SpringBoot默认的ES版本是7.6.2,以是我们须要覆盖默认的ES版本:
- <properties>
- <java.version>1.8</java.version>
- <elasticsearch.version>7.12.1</elasticsearch.version>
- </properties>
复制代码- RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
- HttpHost.create("http://192.168.150.101:9200")
- ));
复制代码
4. 使用JavaRestClient创建索引库
5. 使用JavaRestClient删除索引库
- @Test
- void testDeleteIndex() throws IOException {
- // 1.准备Request
- DeleteIndexRequest request = new DeleteIndexRequest("hotel");
- // 2.发送请求
- client.indices().delete(request, RequestOptions.DEFAULT);
- }
复制代码 6.使用JavaRestClient判断索引库是否存在
- @Test
- void testExistsIndex() throws IOException {
- // 1.准备Request
- GetIndexRequest request = new GetIndexRequest("hotel");
- // 2.发送请求
- boolean isExists = client.indices().exists(request, RequestOptions.DEFAULT);
- System.out.println(isExists ? "存在" : "不存在");
- }
复制代码 二、RestClient利用文档
案例1:使用JavaRestClient实现文档的CRUD
去数据库查询旅馆数据,导入到hotel索引库,实现旅馆数据的CRUD。
根本步调如下:
- 初始化JavaRestClient
- 使用JavaRestClient 新增旅馆数据
3. 使用JavaRestClient 根据id查询旅馆数据
- 使用JavaRestClient 删除旅馆数据
- @Test
- void testDeleteDocumentById() throws IOException {
- // 1.准备Request // DELETE /hotel/_doc/{id}
- DeleteRequest request = new DeleteRequest("hotel", "61083");
- // 2.发送请求
- client.delete(request, RequestOptions.DEFAULT);
- }
复制代码 案例2:使用JavaRestClient批量导入旅馆数据到ES
需求:批量查询旅馆数据,然后批量导入索引库中
思绪:
- 使用mybatis-plus查询旅馆数据
- 将查询到的旅馆数据(Hotel) 转换为文档范例数据(HotelDoc)
- 使用JavaRestClient中 的Bulk批处置处罚,实现批量新增文档,示例代码如下
- @Test
- void testBulkRequest() throws IOException {
- // 查询所有的酒店数据
- List<Hotel> list = hotelService.list();
- // 1.准备Request
- BulkRequest request = new BulkRequest();
- // 2.准备参数
- for (Hotel hotel : list) {
- // 2.1.转为HotelDoc
- HotelDoc hotelDoc = new HotelDoc(hotel);
- // 2.2.转json
- String 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等范例字段。比方:
- 地理(geo)查询:根据经纬度查询。比方:
- geo_distance
- geo_bounding_box
- 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,归并查询条件。比方:
查询全部 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企服之家,中国第一个企服评测及商务社交产业平台。 |