2022年03月开发记录
2022年03月22日
详情页效果全文检索高亮显示
2022年03月开发记录 2022年03月22日 详情页效果经过前段时间的开发,已经把资源详情页面开发完成了,大概长下面这样
然后,由于需要有一个资源推荐功能,也就是下面的列表,也懒得做推荐算法啥的,就去了解了一下ElasticSearch
因为需要一个全文检索,然后检索高亮,当然这部分就是参照CSDN
ElasticSearch环境上的搞好了,然后添加数据测试一下全文检索功能
@Test
public void addData() {
List list = new ArrayList<>();
list.add(new ResourceEntity(1L, "Java", "Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程", "由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。为了解决困难,他们首先着眼于语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。"));
list.add(new ResourceEntity(2L, "Python", "Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。 [1] Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言, [2] 随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。","由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。2018年3月,该语言作者在邮件列表上宣布Python 2.7将于2020年1月1日终止支持。用户如果想要在这个日期之后继续得到与Python 2.7有关的支持,则需要付费给商业供应商。"));
list.add(new ResourceEntity(3L, "Java", "Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程", "由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。为了解决困难,他们首先着眼于语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。"));
list.add(new ResourceEntity(4L, "Python", "Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。 [1] Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言, [2] 随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。","由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。2018年3月,该语言作者在邮件列表上宣布Python 2.7将于2020年1月1日终止支持。用户如果想要在这个日期之后继续得到与Python 2.7有关的支持,则需要付费给商业供应商。"));
resourceRepository.saveAll(list);
}
上面是新增的数据,然后对上面的数据搞了一个检索把
@Test
public void getHighByUser() {
// Scanner scanner = new Scanner(System.in);
// String nextLine = scanner.nextLine();
HighlightBuilder.Field nameField = new HighlightBuilder
.Field("*")
.preTags("")
.postTags("").requireFieldMatch(false);
//多字段查询,可同时在title和description查询 对应实体类中的属性名
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.multiMatchQuery("java是个好东西", "title", "description"))
.withPageable(PageRequest.of(0, 10))
.withHighlightFields(nameField)
.build();
AggregatedPage products = elasticsearchTemplate.
queryForPage(nativeSearchQuery, ResourceEntity.class, new SearchResultMapper() {
@Override
public AggregatedPage mapResults(SearchResponse response, Class clazz, Pageable pageable) {
SearchHits searchHits = response.getHits();
SearchHit[] hits = searchHits.getHits();
ArrayList products = new ArrayList();
for (SearchHit hit : hits) {
ResourceEntity product = new ResourceEntity();
//原始map
Map sourceAsMap = hit.getSourceAsMap();
product.setId(Long.parseLong(sourceAsMap.get("id").toString()));
product.setTitle(sourceAsMap.get("title").toString());
// product.setDescription(Double.parseDouble(sourceAsMap.get("marketPrice").toString()));
// product.setShopPrice(Double.parseDouble(sourceAsMap.get("shopPrice").toString()));
product.setDescription(sourceAsMap.get("description").toString());
product.setResourceContent(sourceAsMap.get("resourceContent").toString());
//高亮
Map highlightFields = hit.getHighlightFields();
System.out.println(highlightFields);
if (highlightFields.get("title") != null) {
String nameHighlight = highlightFields.get("title").getFragments()[0].toString();
product.setTitle(nameHighlight);
}
if (highlightFields.get("description") != null) {
String contentHighlight = highlightFields.get("description").getFragments()[0].toString();
product.setDescription(contentHighlight);
}
products.add(product);
}
return new AggregatedPageImpl((List) products);
}
});
System.out.println(products.getContent());
}
运行结果长这样
马马虎虎把,但上面的代码是我Copy,我得研究一下才能是我自己的东西不是~~
然后我发现,我需要学习一下ElasticSearch的API…
嗯,现在是晚上的10点零六分,有点困了,该睡了 … …



