栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ElasticSearch仿京东搜索

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ElasticSearch仿京东搜索

1.新建项目框架,导入依赖前端素材

        
            org.springframework.boot
            spring-boot-starter-data-elasticsearch
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.jsoup
            jsoup
            1.11.2
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            com.alibaba
            fastjson
            1.2.74
        
    


项目结构:

2.配置文件中定义访问接口
server.port=9090
spring.thymeleaf.cache=false

编写控制层

@Controller
public class IndexController {

    @RequestMapping({"/","/index"})
    public String index(){
        return "index";
    }
}

访问页面测试

3.爬取网页数据

新建工具类和实体类,工具类用于爬取网页的数据,实体类用于存储爬取到的数据。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PaperContent {
    private String img;
    private String price;
    private String title;
}

首先我们需要查看网页的前台结构

编写爬取网页的工具类,对比网页前端的网页结构来编写代码

    public List parseHtmlElement(String keyWord) throws Exception {
        List paperContents=new ArrayList<>();
        //keyword用于需要查询的关键字
        String url="http://search.jd.com/Search?keyword="+keyWord;
        document document = Jsoup.parse(new URL(url), 30000);
        //根据id获取文档
        Element element = document.getElementById("J_goodsList");
//        System.out.println(element);
        //获取标签
        Elements elements = element.getElementsByTag("li");
//        System.out.println(elements);
        //获取元素内容,这里el就是就是
  • 标签 for (Element el:elements) { PaperContent paperContent=new PaperContent(); //获取li标签中的图片信息 //图片是通过懒加载的,并不是直接通过src来获取的 String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img"); //获取li标签中的价格信息 String price = el.getElementsByClass("p-price").eq(0).text(); //获取li标签中的书名信息 String title = el.getElementsByClass("p-name").eq(0).text(); System.out.println("==============================="); System.out.println(img); System.out.println(price); System.out.println(title); paperContent.setImg(img); paperContent.setPrice(price); paperContent.setTitle(title); paperContents.add(paperContent); } return paperContents; }
  • 测试:

    public static void main(String[] args) throws Exception {
            new PageParse().parseHtmlElement("java").forEach(System.out::println);
        }
    

    后台查看是否爬取到数据:

    4.将爬取到的数据放入ElasticSearch中

    编写配置类,连接本地Elasticsearch

    @Configuration
    public class ElasticSearchConfig {
    
        @Bean
        public RestHighLevelClient restHighLevelClient(){
            RestHighLevelClient client=new RestHighLevelClient(
                    RestClient.builder(new HttpHost("127.0.0.1",9200,"http"))
            );
              return client;
        }
    }
    

    编写Service层,将爬取到的数据放入ElasticSearch中前提是索引存在。

        @Autowired
        private RestHighLevelClient restHighLevelClient;
    
    //解析数据放到elasticSearch
        public Boolean parseContent(String keyword) throws Exception {
            //查询到的数据
            List paperContents = new PageParse().parseHtmlElement(keyword);
            BulkRequest bulkRequest=new BulkRequest();
            bulkRequest.timeout("2m");
    
            //将查询到的数据放入容器中
            for (int i = 0; i < paperContents.size(); i++) {
                bulkRequest.add(new IndexRequest("jd_commodity")
                        .source(JSON.toJSONString(paperContents.get(i)), XContentType.JSON));
            }
    
            //将请求中大哥数据放入ElasticSearch(批量插入)
            BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
            return !bulk.hasFailures();
        }
    

    编写controller层,与前端结合

     @RequestMapping("/parse/{keyword}")
        public Boolean pushElk(@PathVariable("keyword") String keyword) throws Exception {
            return jdService.parseContent(keyword);
        }
    

    访问地址运行测试:

    查看elasticsearch是否已经存在数据

    5.将ElasticSearch中的数据显示到前端页面
     //从elasticSearch中获取数据并且高亮显示
        public List> getContent(String keyword,int pageNo,int pageSize) throws IOException {
            if (pageNo<=1){
                pageNo=1;
            }
            //条件搜索
            SearchRequest searchRequest=new SearchRequest("jd_commodity");
            SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
            //分页
            searchSourceBuilder.from(pageNo);
            searchSourceBuilder.size(pageSize);
            //精准查询
            TermQueryBuilder termQueryBuilder= QueryBuilders.termQuery("title",keyword);
            searchSourceBuilder.query(termQueryBuilder);
            searchSourceBuilder.timeout(new Timevalue(60, TimeUnit.SECONDS));
            searchRequest.source(searchSourceBuilder);
            SearchResponse searchs = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            //解析结果
            List> list=new ArrayList<>();
            for (SearchHit hit:searchs.getHits().getHits()) {
                list.add(hit.getSourceAsMap());
            }
            return list;
        }
    

    contoller层调用方法

    @RequestMapping("/parse/{keyword}/{pageNo}/{pageSize}")
        public List> getElk(@PathVariable("keyword") String keyword,
                                               @PathVariable("pageNo") int pageNo,
                                               @PathVariable("pageSize") int pageSize) throws IOException {
            return jdService.getContent(keyword, pageNo, pageSize);
        }
    

    访问设置的地址访问

    与前端结合:
    (html代码)

    
    
    
        
        ElasticSearch仿京东实战
        
        
    
    
    
    <!–商品封面–">> <!–价格–">>

    <!–标题–">>

    <!– 店铺名 –">>
    <!– 成交信息 –">>

    月成交999笔 评价 3

    测试:
    可以检索出相关数据

    高亮设置

    高亮:设置高亮字段,替换原来的字段
    向读取内容的方法中添加以下代码,


    测试:

    完成。

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

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

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