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

ES的搜索的实现

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

ES的搜索的实现

ES的搜索的实现 搭建项目

修改配置文件

server:
  port: 9090
spring:
  thymeleaf:
    cache: false

导入依赖



	4.0.0
	
		org.springframework.boot
		spring-boot-starter-parent
		2.2.5.RELEASE
		 
	
	com.xys
	jingdongfind
	0.0.1-SNAPSHOT
	jingdongfind
	Demo project for Spring Boot
	
		1.8
		
		7.6.1
	
	
		
		
			org.jsoup
			jsoup
			1.10.2
		
		
			com.alibaba
			fastjson
			1.2.62
		
		
			org.springframework.boot
			spring-boot-starter-data-elasticsearch
		
		
			org.springframework.boot
			spring-boot-starter-thymeleaf
		
		
			org.springframework.boot
			spring-boot-starter-web
		

		
			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
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
				
					
						
							org.projectlombok
							lombok
						
					
				
			
		
	



编写前端页面index.html




    
    狂神说Java-ES仿京东实战
    



{{result.price}}

店铺: 狂神说Java

月成交999笔 评价 3

编写工具类HtmlParseUtil
@Component
public class HtmlParseUtil {
    

    public ArrayList parseJD(String keywords) throws Exception {
        //获取请求https://search.jd.com/Search?keyword=/前提,需要联网!
        //解析网页。(Jsoup返回document就是浏览器document对象)
        String url = "https://search.jd.com/Search?keyword="+keywords;
        //所有你在js中可以使用的方法,这里都能用!
        document document = Jsoup.parse(new URL(url),30000);
        //获取所有的Li元素
        Element element = document.getElementById("J_goodsList");
        //获取元素中的内容, 这里eL就是每一个Li标签了 !
        Elements elements = element.getElementsByTag("li");
        ArrayList goodList=new ArrayList<>();
        for (Element el : elements) {
            String img = el.getElementsByTag("img" ).eq(0).attr("data-lazy-img");
            String price = el.getElementsByClass("p-price").eq(0).text();
            String title = el.getElementsByClass("p-name").eq(0).text();
            Content content=new Content();
            content.setTitle(title);
            content.setImg(img);
            content.setPrice(price);
            goodList.add(content);
        }
        return goodList;
    }
}
编写配置层ElasticSearchConfig
@Configuration
public class ElasticSearchConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1", 9200, "http")));
        return client;
    }
}
编写实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Content implements Serializable {
    private String title;
    private String img;
    private String price;
}
编写服务层ContentService
@Service("ContentService")
public class ContentService {

    @Autowired
    @Qualifier("restHighLevelClient")
    RestHighLevelClient client;

    //1.解析数据放入es索引
    public Boolean ContentParse(String keywords) throws Exception{
        List contents=new HtmlParseUtil().parseJD(keywords);
        //把查询到的数据放入es中
        BulkRequest bulkRequest=new BulkRequest();
        bulkRequest.timeout("2m");
        for (int i = 0; i < contents.size(); i++) {
            bulkRequest.add(
                    new IndexRequest("jd_goods")
                            .source(JSON.toJSONString(contents.get(i)), XContentType.JSON));
        }
        BulkResponse bulkResponse=client.bulk(bulkRequest, RequestOptions.DEFAULT);
        return !bulkResponse.hasFailures();
    }

    //2.获取这些数据实现搜索功能
    public List> searchPage(String keyword,int pageNo,int pageSize) throws Exception {
        if (pageNo<=1){
            pageNo=1;
        }
        //条件搜索
        SearchRequest searchRequest = new SearchRequest("jd_goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //分页
        sourceBuilder.from(pageNo);
        sourceBuilder.size(pageSize);
        //精准匹配
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword);
        sourceBuilder.query(termQueryBuilder);
        sourceBuilder.timeout(new Timevalue(60, TimeUnit.SECONDS));
        //执行搜索
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse=client.search(searchRequest,RequestOptions.DEFAULT);
        //解析结果
        ArrayList> list=new ArrayList<>();
        for (SearchHit hit : searchResponse.getHits().getHits()) {
            list.add(hit.getSourceAsMap());
        }
        return list;
    }

    //3.获取这些数据实现高亮搜索功能
    public List> searchHighPage(String keyword,int pageNo,int pageSize) throws Exception {
        if (pageNo<=1){
            pageNo=1;
        }
        //条件搜索
        SearchRequest searchRequest = new SearchRequest("jd_goods");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //分页
        sourceBuilder.from(pageNo);
        sourceBuilder.size(pageSize);
        //精准匹配
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword);
        sourceBuilder.query(termQueryBuilder);
        sourceBuilder.timeout(new Timevalue(60, TimeUnit.SECONDS));
        //高亮
        HighlightBuilder highlightBuilder=new HighlightBuilder();
        highlightBuilder.field("title");
        //多个高亮关闭
        highlightBuilder.requireFieldMatch(false);
        highlightBuilder.preTags("");
        highlightBuilder.postTags("");
        sourceBuilder.highlighter(highlightBuilder);
        //执行搜索
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse=client.search(searchRequest,RequestOptions.DEFAULT);
        //解析结果
        ArrayList> list=new ArrayList<>();
        for (SearchHit hit : searchResponse.getHits().getHits()) {
            //获取高亮的字段
            Map highlightFields = hit.getHighlightFields();
            HighlightField title = highlightFields.get("title");
            //原来的结果
            Map sourceAsMap = hit.getSourceAsMap();
            //解析高亮的字段,将原来的字段换成我们加入的字段
            if (title!=null){
                Text[] fragments = title.fragments();
                String n_title="";
                for (Text fragment : fragments) {
                    n_title+=fragment;
                }
                //高亮字段替换原来的字段
                sourceAsMap.put("title",n_title);
            }

            list.add(sourceAsMap);
        }
        return list;
    }
}
编写控制层
@Controller
public class IndexController {

    @GetMapping({"/","/index"})
    public String index(){
        return "index";
    }
}
@RestController
public class ContentController {

    @Autowired
    ContentService service;

    @GetMapping("/parse/{keyword}")
    public Boolean parse(@PathVariable("keyword") String keyword) throws Exception{
        return service.ContentParse(keyword);
    }

    @GetMapping("/search/{keyword}/{pageNo}/{pageSize}")
    public List> search(@PathVariable("keyword") String keyword,
                                           @PathVariable("pageNo") int pageNo,
                                           @PathVariable("pageSize") int pageSize) throws Exception {
        service.ContentParse(keyword);
        return service.searchHighPage(keyword,pageNo,pageSize);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/727615.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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