栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

个人建站记录

个人建站记录

个人建站

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点零六分,有点困了,该睡了 … …

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/780880.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号