ES进阶使用

配置

pom依赖
        <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>7.17.5</version></dependency>
yml配置
elasticsearch:address: http://192.168.133.100:9200
数据库实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tb_hotel")
public class Hotel {@TableId(type = IdType.INPUT)private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String longitude;private String latitude;private String pic;
}
ES实体类

location:将位置信息聚合【经纬度】成一个点,对应es中mapping的geo_bouding_box类型

@Data
@NoArgsConstructor
public class HotelDoc {private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String location;private String pic;private List<String> suggestion;public HotelDoc(Hotel hotel) {this.id = hotel.getId();this.name = hotel.getName();this.address = hotel.getAddress();this.price = hotel.getPrice();this.score = hotel.getScore();this.brand = hotel.getBrand();this.city = hotel.getCity();this.starName = hotel.getStarName();this.business = hotel.getBusiness();this.location = hotel.getLatitude() + ", " + hotel.getLongitude();this.pic = hotel.getPic();this.suggestion = new ArrayList<>();if (this.business.contains("/")) {String[] split1 = this.business.split("/");Collections.addAll(this.suggestion, split1);} else if (this.business.contains("、")) {String[] split2 = this.business.split("、");Collections.addAll(this.suggestion, split2);} elsethis.suggestion.add(this.business);this.suggestion.add(this.brand);}
}
配置类
@Configuration
public class ElasticsearchConfig {@Value("${elasticsearch.address}")private String address;@Beanpublic ElasticsearchClient elasticsearchClient() {RestClient restClient = RestClient.builder(HttpHost.create(address)).build();RestClientTransport restClientTransport = new RestClientTransport(restClient, new JacksonJsonpMapper());return new ElasticsearchClient(restClientTransport);}}
如果使用代码生成映射【mapping】
public class HotelIndexConstants {public static final String MAPPING_TEMPLATE = "{\n" +"  \"mappings\": {\n" +"    \"properties\": {\n" +"      \"id\": {\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"name\": {\n" +"        \"type\": \"text\",\n" +"        \"analyzer\": \"ik_max_word\",\n" +"        \"copy_to\": \"all\"\n" +"      },\n" +"      \"address\": {\n" +"        \"type\": \"keyword\",\n" +"        \"index\": false\n" +"      },\n" +"      \"price\": {\n" +"        \"type\": \"integer\"\n" +"      },\n" +"      \"score\": {\n" +"        \"type\": \"integer\"\n" +"      },\n" +"      \"brand\": {\n" +"        \"type\": \"keyword\",\n" +"        \"copy_to\": \"all\"\n" +"      },\n" +"      \"city\": {\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"starName\": {\n" +"        \"type\": \"keyword\"\n" +"      },\n" +"      \"business\": {\n" +"        \"type\": \"keyword\",\n" +"        \"copy_to\": \"all\"\n" +"      },\n" +"      \"pic\": {\n" +"        \"type\": \"keyword\",\n" +"        \"index\": false\n" +"      },\n" +"      \"location\": {\n" +"        \"type\": \"geo_point\"\n" +"      },\n" +"      \"all\": {\n" +"        \"type\": \"text\",\n" +"        \"analyzer\": \"ik_max_word\"\n" +"      }\n" +"    }\n" +"  }\n" +"}";
}

使用

service层
@Service
@Slf4j
public class HotelServiceImpl extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {@Autowiredprivate ElasticsearchClient elasticsearchClient;@Autowiredprivate HotelMapper hotelMapper;
}
索引
创建索引
@SneakyThrows
@Override
public Boolean createHotelIndex() {CreateIndexRequest request = CreateIndexRequest.of(builder -> builder.index("hotel").settings(s -> s.analysis(a -> a.analyzer("chinese_analyzer", an -> an.custom(v -> v.tokenizer("ik_max_word").filter("py"))).analyzer("pinyin_analyzer", an -> an.custom(v -> v.tokenizer("keyword").filter("py"))))).mappings(mapperClass -> mapperClass.properties("id", p -> p.keyword(k -> k)).properties("name", p -> p.text(t -> t.analyzer("ik_max_word").searchAnalyzer("ik_smart").copyTo("all"))).properties("address", p -> p.keyword(k -> k.index(false))).properties("price", p -> p.integer(i -> i)).properties("score", p -> p.integer(i -> i)).properties("brand", p -> p.keyword(k -> k.copyTo("all"))).properties("city", p -> p.keyword(k -> k)).properties("startName", p -> p.keyword(k -> k)).properties("business", p -> p.keyword(k -> k.copyTo("all"))).properties("location", p -> p.geoPoint(g -> g)).properties("pic", p -> p.keyword(k -> k.index(false))).properties("all", p -> p.text(t -> t.analyzer("ik_max_word"))).properties("suggest", p -> p.completion(v -> v.analyzer("pinyin_analyzer")))));CreateIndexResponse response = elasticsearchClient.indices().create(request);return response.acknowledged();
}
删除索引
@SneakyThrows
@Override
public Boolean deleteHotelIndex() {DeleteIndexRequest request = DeleteIndexRequest.of(builder -> builder.index("hotel"));DeleteIndexResponse delete = elasticsearchClient.indices().delete(request);return delete.acknowledged();
}
查询索引是否存在
@SneakyThrows
@Override
public Boolean existsHotelIndex() {return elasticsearchClient.indices().exists(builder -> builder.index("hotel")).value();
}
文档
创建文档
@SneakyThrows
@Override
public Boolean createHotelDocument() {Hotel hotel = hotelMapper.selectById(61083L);HotelDoc hotelDoc = new HotelDoc(hotel);elasticsearchClient.index(builder ->builder.index("hotel").document(hotelDoc).id(hotel.getId().toString()));return null;
}
查询文档
@SneakyThrows
@Override
public HotelDoc getHotelDocument() {GetResponse<HotelDoc> hotel = elasticsearchClient.get(builder ->builder.index("hotel").id("61083"), HotelDoc.class);log.debug("Hotel是否存在:{}", hotel.found());return hotel.source();
}
更新文档
@SneakyThrows
@Override
public Result updateHotelDocument() {HotelDoc hotelDoc = new HotelDoc();hotelDoc.setAddress("杭州市余杭区");Result hotel = elasticsearchClient.update(builder ->builder.index("hotel").id("61083").doc(hotelDoc), HotelDoc.class).result();log.debug("update:{}", hotel);return hotel;
}
删除文档
@SneakyThrows
@Override
public Result deleteHotelDocument() {return elasticsearchClient.delete(builder ->builder.index("hotel").id("61083")).result();
}
批量添加和删除文档
@SneakyThrows
@Override
public void bulkAddDocument() {List<Hotel> hotelList = hotelMapper.selectList(null);List<BulkOperation> bulkOperationsAdd = new ArrayList<>();List<BulkOperation> bulkOperationsRemove = new ArrayList<>();hotelList.forEach(hotel -> {HotelDoc hotelDoc = new HotelDoc(hotel);BulkOperation.Builder add = new BulkOperation.Builder();BulkOperation create = add.create(d ->d.document(hotelDoc).id(hotel.getId().toString()).index("hotel")).build();bulkOperationsAdd.add(create);BulkOperation.Builder remove = new BulkOperation.Builder();BulkOperation delete = remove.delete(d ->d.id(hotel.getId().toString()).index("hotel")).build();bulkOperationsRemove.add(delete);});BulkResponse del = elasticsearchClient.bulk(builder ->builder.index("hotel").operations(bulkOperationsRemove));BulkResponse hotel = elasticsearchClient.bulk(builder ->builder.index("hotel").operations(bulkOperationsAdd));log.debug("是否有错误:{}", hotel.errors());
}
高级查询
@SneakyThrows
@Override
public void matchAll() {// 1. 查全部SearchRequest request = SearchRequest.of(builder ->builder.index("hotel").query(Query.of(q -> q.matchAll(m -> m))));log.debug("所有数据:{}", search(request));// 1.1 分页查询SearchRequest request11 = SearchRequest.of(builder -> builder.index("hotel").query(Query.of(q -> q.matchAll(m -> m))).from(2).size(2));log.debug("分页数据:{}", search(request11));// 1.2 排序查询SearchRequest request12 = SearchRequest.of(builder -> builder.index("hotel").query(Query.of(q -> q.matchAll(m -> m))).sort(s -> s.field(v -> v.field("price").order(SortOrder.Desc))));log.debug("排序数据:{}", search(request12));// 1.3 条件查询SearchRequest request13 = SearchRequest.of(builder -> builder.index("hotel").query(Query.of(q -> q.matchAll(m -> m))).sort(s -> s.field(v -> v.field("price").order(SortOrder.Desc))).source(s -> s.filter(v -> v.includes("id", "name", "price").excludes("address"))));log.debug("自定义查询输出的数据:{}", search(request13));// 2. 单字段查询// 2.1 全文检索SearchRequest request21 = SearchRequest.of(builder ->builder.index("hotel").query(q -> q.match(v -> v.field("all").query("如家"))));log.debug("单字段模糊查询:{}", search(request21));// 2.2 精确查询【适合查询部分不分词的字段】SearchRequest request22 = SearchRequest.of(builder ->builder.index("hotel").query(q -> q.term(v -> v.field("city").value("深圳"))));log.debug("单字段精确查询:{}", search(request22));// 2.3 范围查询SearchRequest request23 = SearchRequest.of(builder -> builder.index("hotel").query(q -> q.range(v -> v.field("price").gte(JsonData.of(100)).lte(JsonData.of(150)))));log.debug("单字段范围查询:{}", search(request23));// 3. 多字段查询SearchRequest request3 = SearchRequest.of(builder -> builder.index("hotel").query(q -> q.multiMatch(v -> v.fields("name", "brand", "business").query("宝安"))));log.debug("多字段模糊查询:{}", search(request3));// 4. 组合查询// 4.1 andSearchRequest request41 = SearchRequest.of(builder -> builder.index("hotel").query(q -> q.bool(b -> b.must(m -> m.match(v -> v.field("name").query("如家"))).must(m -> m.term(v -> v.field("price").value(149))))));log.debug("and查询:{}", search(request41));// 4.2 orSearchRequest request42 = SearchRequest.of(builder -> builder.index("hotel").query(q -> q.bool(b -> b.should(m -> m.match(v -> v.field("name").query("如家"))).should(m -> m.term(v -> v.field("price").value(149))))));log.debug("or查询:{}", search(request42));// 5. 模糊查询【补全】SearchRequest request5 = SearchRequest.of(builder -> builder.index("hotel").query(q -> q.fuzzy(f -> f.field("name").value("如加").fuzziness("2").prefixLength(1))));log.debug("模糊查询:{}", search(request5));// 6. 高亮SearchRequest request6 = SearchRequest.of(builder -> builder.index("hotel").query(q -> q.match(qm -> qm.field("name").query("如家"))).highlight(h -> h.fields("name",f -> f.preTags("<em>").postTags("<em>"))));log.debug("高亮查询:{}", searchSome(request6));// 7. 相关性算分SearchRequest request7 = SearchRequest.of(builder -> builder.index("hotel").query(q -> q.functionScore(fs -> fs.query(fq -> fq.match(f -> f.field("name").query("外滩"))).functions(f -> f.filter(fd -> fd.term(t -> t.field("city").value("上海"))).weight(5.0)).boostMode(FunctionBoostMode.Multiply))));log.debug("相关性算分查询:{}", searchSome(request7));// 8. 拼音查询SearchRequest request8 = SearchRequest.of(builder ->builder.index("hotel").query(q -> q.match(v -> v.field("name.pinyin").query("s8"))));log.debug("拼音单字段全文检索查询:{}", search(request8));
}@SneakyThrowsprivate List<HotelDoc> search(SearchRequest request) {List<Hit<HotelDoc>> hits = elasticsearchClient.search(request, HotelDoc.class).hits().hits();List<HotelDoc> list = new ArrayList<>();hits.forEach(h -> list.add(h.source()));return list;}@SneakyThrowsprivate SearchResponse<HotelDoc> searchSome(SearchRequest request) {return elasticsearchClient.search(request, HotelDoc.class);}
聚合查询
@SneakyThrows@Overridepublic void aggregate() {// 1. Bucket桶SearchRequest request1 = SearchRequest.of(builder -> builder.index("hotel").aggregations("brand_Agg", a -> a.terms(v -> v.field("brand"))).query(q -> q.term(v -> v.field("city").value("上海"))).query(q -> q.range(r -> r.field("price").lte(JsonData.of(300)).gte(JsonData.of(100)))));log.debug("聚合查询:Bucket桶:{}", searchSome(request1).aggregations());}
自动补全
@SneakyThrows@Overridepublic List<HotelDoc> suggest(String value) {// 1. 自动补全SearchRequest request = SearchRequest.of(builder -> builder.index("hotel").suggest(s -> s.suggesters("suggestions", fn -> fn.prefix(value).completion(c -> c.field("suggestion").size(10)))));List<CompletionSuggestOption<HotelDoc>> suggestions = searchSome(request).suggest().get("suggestions").get(0).completion().options();List<HotelDoc> list = suggestions.stream().map(CompletionSuggestOption::source).collect(Collectors.toList());log.debug("自动补全:{}", list);return list;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery动态引入js和css

直接上代码吧&#xff0c;但是有时候这个方法会失败&#xff0c;js文件里面的方法不生效&#xff0c;原因还在找 // 动态引入cssvar cssFileUrl index.css;$("head").append("<link>");css $("head").children(":last");css.a…

计算机导论06-人机交互

文章目录 人机交互基础人机交互概述人机交互及其发展人机交互方式人机界面 新型人机交互技术显示屏技术跟踪与识别&#xff08;技术&#xff09;脑-机接口 多媒体技术多媒体技术基础多媒体的概念多媒体技术及其特性多媒体技术的应用多媒体技术发展趋势 多媒体应用技术文字&…

MySQL进阶篇:索引(概述,结构,分类,语法,SQL性能分析,索引使用,设计原则)

目录 1.索引概述2.索引结构1.B树&#xff08;多路平衡查找树&#xff09;2.B树3.Hash1.特点2.存储引擎支持 4.选择B树作为InnoDB存储引擎索引结构的原因 3.索引分类1.聚集索引选取规则2.回表查询 4.索引语法1.创建索引2.查看索引3.删除索引 5.SQL性能分析1.SQL执行频率2.慢查询…

某马头条——day06

自媒体文章上下架 使用消息队列在自媒体下架时通知文章微服务。 kafka概述 kafka环境搭建 docker pull zookeeper:3.4.14 docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14 安装kafka docker pull wurstmeister/kafka:2.12-2.3.1 docker run -d --name kafka…

代码随想录算法训练营第四十五天| 70.爬楼梯(进阶)、322.零钱兑换、279.完全平方数

代码随想录算法训练营第四十五天| 70.爬楼梯&#xff08;进阶&#xff09;、322.零钱兑换、279.完全平方数 题目 70.爬楼梯&#xff08;进阶&#xff09; 57.爬楼梯&#xff08;第八期模拟笔试&#xff09; https://kamacoder.com/problempage.php?pid1067 题目描述 假设…

【C++PCL】点云处理DBSCAN点云聚类分割

作者:迅卓科技 简介:本人从事过多项点云项目,并且负责的项目均已得到好评! 公众号:迅卓科技,一个可以让您可以学习点云的好地方 本专栏特色:根据经验和大家分享每个参数的调试规范,解决大家因为参数的问题而产生的苦恼。 目录 1.原理介绍 2.代码效果 3.源码展示

后台管理系统: spu管理模块

spu管理模块业务 spu 可以理解为类 例如 people类【spu】 sku可以理解为实例 例如&#xff1a;小明 18 男 spu跟sku可以理解为类跟多个实例的关系 spu管理模块静态 <template><div><el-card style"margin: 20px 0px"><CategorySelect get…

ARM安装与项目结构

1. 安装环境 参考E:\peixunQianrushi\arm\ziliao\FS4412新版&#xff08;学生资料&#xff09;\环境相关资料 这边建议全部默认路径 安装注意事项&#xff1a; 1、在接下来的安装过程中&#xff0c;对于使用win10、win8的操作系统的用户&#xff0c;所有的安装请均以管理员身份…

POKT Network (POKT) :进军百亿美元市场规模的人工智能推理市场

POKT Network&#xff08;又称 Pocket Network&#xff09;是一个去中心化的物理基础设施网络&#xff08;DePIN&#xff09;&#xff0c;它能够协调并激励对任何开放数据源的访问&#xff0c;最初专注于向应用程序和服务提供商提供区块链数据。 自 2020 年主网上线以来&#x…

第十五章 : Spring Cloud全链路监控(Pinpoint实战)

第十五章 : Spring Cloud全链路监控(Pinpoint实战) 前言 本章知识点: Pinpoint的发展历程、特点、优势以及整体架构;数据结构以及对集成框架的兼容性以及Pinpoint实战。 Springboot 2.3.12.RELEASE,spring cloud Hoxton.SR12,spring cloud alibaba 2.2.9.RELEASE发展历…

【GitHub项目推荐--推荐 5 个炫炫炫的可视化项目】【转载】

数据可视化就是将抽象的数据通过视觉的方式进行展示&#xff0c;能让用户直观的看到数据中蕴含的信息和规律。 本篇文章&#xff0c;整理了 5 个可视化开源项目&#xff0c;其中包括可视化制作低代码平台、大屏可视化、地图可视化、热图、图标可视化等等。 00. 数据大屏可视化…

Rust基础语法1

所有权转移&#xff0c;Rust中没有垃圾收集器&#xff0c;使用所有权规则确保内存安全&#xff0c;所有权规则如下&#xff1a; 1、每个值在Rust中都有一个被称为其所有者&#xff08;owner&#xff09;的变量&#xff0c;值在任何时候只能有一个所有者。 2、当所有者离开作用域…

WordPress微信一键关注免认证登录插件

插件介绍 WordPress微信免认证快捷登录插件&#xff1a;订阅号也能一键通行 这款WordPress插件专为个人用户打造&#xff0c;无需繁琐的服务号申请与认证流程。即使您只有未认证的订阅号&#xff0c;也能轻松实现关注公众号后一键登录网站的功能&#xff01; 配置步骤简单明…

【算法详解】力扣88.合并两个有序数组

一、题目介绍 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xf…

动态规划基础(二)最长公共子序列 LCS

讲解求两个串中最长的公共的子序列长度或输出子序列等 poj1458 题目大意 给定两个字符串&#xff0c;要求输出两个字符串中最长公共子序列长度 思路 我们定义 a [ i ] [ j ] a[i][j] a[i][j]为&#xff0c;当字串 s t r 1 str1 str1到 i i i位置&#xff0c;字串 s t r 2 s…

采埃孚: 优化1/4员工;苹果Vision Pro开抢,黄牛9万一台 ;招商银行:2023年净利润1466亿元

今日精选 • 采埃孚: 优化1/4员工• 苹果Vision Pro开抢&#xff0c;黄牛9万一台• 招商银行&#xff1a;2023年净利润1466亿元&#xff0c;同比增长6.22% 科技动态 • OpenAI CEO 拟募集百亿级美元&#xff0c;建立 AI 芯片工厂网络以满足需求• 中西医结合“数智岐黄”大模…

【接上篇】二、Flask学习之CSS(下篇)

上篇&#xff1a;二、Flask学习之CSS 3.8hover hover是用来美化鼠标悬停的效果的&#xff0c;当鼠标停放在某个区域&#xff0c;就会执行对应的hover操作。可以操作本标签的内容&#xff0c;也可以操作本标签下某一个标签的内容 3.9after <!DOCTYPE html> <html l…

Unity3d C#实现场景编辑/运行模式下3D模型XYZ轴混合一键排序功能(含源码工程)

前言 在部分场景搭建中需要整齐摆放一些物品&#xff08;如仓库中的货堆、货架等&#xff09;&#xff0c;因为有交互的操作在单个模型上&#xff0c;每次总是手动拖动模型操作起来也是繁琐和劳累。 在这背景下&#xff0c;我编写了一个在运行或者编辑状态下都可以进行一键排序…

C#设计模式教程(10):装饰器模式

装饰器模式的定义 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许用户在不修改现有对象结构的情况下,动态地给一个对象添加额外的职责。这种模式创建了一个装饰类,用来包装原有的类。 这种模式创建了一个装饰类,用于包装原有的类,并在保持类方法签名完整性…

JS-元素尺寸与位置

通过js的方式&#xff0c;得到元素在页面中的位置 获取宽高 元素.offsetWidth 元素.offsetHeight 1&#xff09;获取元素的自身宽高、包括元素自身设置的宽高paddingborder 2&#xff09;获取出来的是数值&#xff0c;方便计算 3&#xff09;注意&#xff1a;获取的是可视…