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

ElasticSearch(三)

ElasticSearch(三)

ES仿京东搜索

爬取京东数据

public class HtmlParseUtil {
   

    public List parseJD(String keywords) throws IOException {
        //jsoup不能抓取ajax请求,除非自己模拟浏览器进行请求
        String url = "https://search.jd.com/Search?keyword="+keywords;
        //解析网页
        document document = Jsoup.parse(new URL(url), 30000);
        //抓取搜索到的数据
        //document就相当于JS的document对象
        Element j_goodsList = document.getElementById("J_goodsList");
        //找到所有的li属性,一个li就对应一个商品的所有属性
        Elements lis = j_goodsList.getElementsByTag("li");
        List products = new ArrayList<>();
        //获取京东的商品信息
        for (Element li : lis) {
            // String img = li.getElementsByTag("img").eq(0).attr("src");
            //
            String img = li.getElementsByTag("img").eq(0).attr("data-lazy-img");
            String price = li.getElementsByClass("p-price").eq(0).text();
            String name = li.getElementsByClass("p-name").eq(0).text();
            Product product = new Product();
            product.setImg(img);
            product.setTitle(name);
            product.setPrice(price);
            products.add(product);
        }
        return products;
    }

   
}

elasticsearch注入

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

相应的service和controller

@Service
public class ProductService {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
    private final String INDEXNAME = "jd_goods";

    
    public Boolean parseProduct(String keywords) throws IOException {
        //解析查询出来的数据
        List products = new HtmlParseUtil().parseJD(keywords);
        if(CollectionUtils.isEmpty(products)){
            throw new RuntimeException("未查询到"+keywords+"的相关信息");
        }
        //封装数据到索引库中
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout(Timevalue.timevalueSeconds(20));
        for (Product product : products) {
            bulkRequest.add(new IndexRequest(INDEXNAME).source(JSON.toJSONString(product), XContentType.JSON));
        }
        RequestOptions options;
        BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        return !bulkResponse.hasFailures();
    }
    
    public Boolean deleteIndex() throws IOException {
        GetIndexRequest request2 = new GetIndexRequest(INDEXNAME);
        boolean exists = restHighLevelClient.indices().exists(request2,RequestOptions.DEFAULT);
        if(exists){
            DeleteIndexRequest request = new DeleteIndexRequest(INDEXNAME);
            AcknowledgedResponse delete =restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
            return delete.isAcknowledged();
        }
        return false;
    }
    public List> searchContentPage(String keyword,int pageNo,int pageSize) throws IOException {
        //基本的参数判断
        if(pageNo<=1){
            pageNo=1;
        }
        //基本的条件搜索
        SearchRequest searchRequest = new SearchRequest(INDEXNAME);
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //分页
        builder.from(pageNo);
        builder.size(pageSize);
        //组装查询条件
        //精准匹配
        //TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword);
        MatchQueryBuilder termQueryBuilder = QueryBuilders.matchQuery("title", keyword);
        builder.query(termQueryBuilder);
        builder.timeout(Timevalue.timevalueSeconds(20));
        searchRequest.source(builder);
        //搜索
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        //解析结果
        List> resultList = new ArrayList<>();
        for (SearchHit hit : searchResponse.getHits().getHits()) {
            resultList.add(hit.getSourceAsMap());
        }
        return resultList;
    }
    public List> searchContentHighLighterPage(String keyword,int pageNo,int pageSize) throws IOException {
        //基本的参数判断
        if(pageNo<=1){
            pageNo=1;
        }
        //基本的条件搜索
        SearchRequest searchRequest = new SearchRequest(INDEXNAME);
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //分页
        builder.from(pageNo);
        builder.size(pageSize);
        //组装查询条件
        //精准匹配
        //TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword);
        MatchQueryBuilder termQueryBuilder = QueryBuilders.matchQuery("title", keyword);
        builder.query(termQueryBuilder);
        builder.timeout(Timevalue.timevalueSeconds(20));
        //高亮构建
        //生成高亮查询
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        //高亮查询字段
        highlightBuilder.field("title");
        //如果要多个字段高亮这项需为false
        highlightBuilder.requireFieldMatch(false);
        highlightBuilder.preTags("");
        highlightBuilder.postTags("");
        builder.highlighter(highlightBuilder);
        searchRequest.source(builder);
        //搜索
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        //解析结果
        List> resultList = new ArrayList<>();
        for (SearchHit hit : searchResponse.getHits().getHits()) {
            //获取高亮字段
            Map highlightFieldMap = hit.getHighlightFields();
            HighlightField title = highlightFieldMap.get("title");
           Map source =  hit.getSourceAsMap();
           //千万记得要记得判断是不是为空,不然你匹配的第一个结果没有高亮内容,那么就会报空指针异常,这个错误一开始真的搞了很久
            //解析高亮的字段,将原来的字段替换为我们高亮的字段
            if(title!=null){
                Text[] fragments = title.fragments();
                String name = "";
                for (Text fragment : fragments) {
                    name += fragment;
                }
                source.put("title",name);
            }
            resultList.add(source);
        }
        return resultList;
    }
}

前端实现

#安装vue和axios
cnpm install vue
cnpm install axios

将安装目录下的js拷贝到项目

引入js并写相应的javascript方法




搜索按钮绑定事件searchKey,搜索内容绑定keyword

将查询内容展示到页面

根据看狂神说视屏学习的,需要的bilibili搜索狂神说

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

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

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