1.创建索引库index_one,并指定字段类型和使用IK分词器

/*** 创建索引(索引库)*** kibana返回结果*** PUT /test** {*   "acknowledged" : true,*   "shards_acknowledged" : true,*   "index" : "test"* }**/
@Test
public void createIndex() throws Exception{CreateIndexRequest createIndexRequest = new CreateIndexRequest("index_one");//设置索引库的属性(包括字段以及字段的分词方式    )XContentBuilder builder =  XContentFactory.jsonBuilder();builder.startObject();{builder.startObject("properties");{//id属性设置builder.startObject("id");{builder.field("type","long");}builder.endObject();//name属性设置,采用ik分词器builder.startObject("name");{builder.field("type","text")//索引时按照最细粒度进行分词.field("analyzer","ik_max_word")//搜索时采用最粗粒度分词或者不分词,可以提高搜索效率.field("search_analyzer","ik_smart");}builder.endObject();//price属性设置builder.startObject("price");{builder.field("type","double");}builder.endObject();}builder.endObject();}builder.endObject();createIndexRequest.mapping(builder);CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);log.info(createIndexResponse.index());//是否创建成功log.info(Boolean.toString(createIndexResponse.isAcknowledged()));log.info(Boolean.toString(createIndexResponse.isShardsAcknowledged()));
}

2.获取数据源。通过Jsoup爬虫京东获取数据并插入到索引库

@Testpublic void addData() throws Exception{//从京东爬虫获取数据(JAVA疯狂讲义)List<Data> list = GetData.parse("JAVA疯狂讲义");BulkRequest bulkRequest = new BulkRequest();//构造批量插入请求for(Data data : list){bulkRequest.add(new IndexRequest("index_one")
.id(String.valueOf(list.indexOf(data))).source(JSON.toJSONString(data),XContentType.JSON));}BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);//判断是否插入成功:false表示没有失败,等于成功System.out.println(bulkResponse.hasFailures());}
//爬虫工具类public static List<Data> parse(String keyword) throws Exception{String url = "https://search.jd.com/Search?keyword=" + keyword;Document document = Jsoup.connect(url).get();Element element = document.getElementById("J_goodsList");Elements elements = element.getElementsByTag("li");List<Data> list = new ArrayList<>();for(Element e : elements){String img = e.getElementsByTag("img").eq(0).attr("data-lazy-img");String price = e.getElementsByClass("p-price").eq(0).text();String name = e.getElementsByClass("p-name").eq(0).text();System.out.println("价格:" + price);System.out.println("书名:" + name);System.out.println("****************************");list.add(new Data(name,Double.valueOf(price.replace("¥",""))));}return  list;}

执行后使用ES-Head查看索引库数据,如图


3.实现分页查询,先使用Kibana用如下命令测试下
(每页数据大小为5,获取第二页的数据)

GET /index_one/_doc/_search
{"query":{"term":{"name":"关注"}},//开始索引"from":5,//每页大小(从开始索引处算起,获取几个数据)"size":5
}

返回结果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 9,"relation" : "eq"},"max_score" : 1.3273783,"hits" : [{"_index" : "index_one","_type" : "_doc","_id" : "8","_score" : 1.2545283,"_source" : {"name" : "疯狂JAVA讲义(第5版)(含DVD光盘一张) 新华书店,正版保证,关注店铺成为会员可享店铺专属优惠,团购客户请咨询在线客服!","price" : 81.5}},{"_index" : "index_one","_type" : "_doc","_id" : "13","_score" : 1.2409074,"_source" : {"name" : "疯狂Java面试讲义 数据结构、算法与技术素养 图书 新华书店,正版保证,关注店铺成为会员可享店铺专属优惠,团购客户请咨询在线客服!","price" : 62.5}},{"_index" : "index_one","_type" : "_doc","_id" : "12","_score" : 1.2275794,"_source" : {"name" : "保证正版 疯狂JAVA讲义(第3版)(含CD光盘1张) 无 电子工业出版社 978712123669 现货直发,赠运费险。咨询客服关注店铺领取无门槛优惠券","price" : 49.0}},{"_index" : "index_one","_type" : "_doc","_id" : "17","_score" : 1.1892588,"_source" : {"name" : "疯狂Java讲义(第3版)(含光盘) ava从入门到精通 java编程思想java核心技术 新华书店,正版保证,关注店铺领取专属优惠,双旦季遇礼,全场满就送点击进入","price" : 65.4}}]}
}

从结果可以看出,将“关注”作为词查询,返回9条数据,分页返回4条数据,我们要的是第二页返回5条,结果是正确的
4.代码实现

//业务层实现
public List<Map<String,Object>> search(String keyWord,int currentPage,int pageSize) throws Exception{List<Map<String, Object>> list = new ArrayList<>();if(currentPage <= 1){currentPage = 1;}//未处理最大页数SearchRequest searchRequest = new SearchRequest("index_one");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name",keyWord);searchSourceBuilder.query(termQueryBuilder).from((currentPage-1)*pageSize).size(pageSize);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] searchHits = searchResponse.getHits().getHits();for(SearchHit hit : searchHits){Map<String,Object> map =  hit.getSourceAsMap();list.add(map);}return list;}
//控制层实现
@GetMapping("/search/{keyWord}/{currentPage}/{pageSize}")public List<Map<String,Object>> search(@PathVariable("keyWord") String keyWord,@PathVariable("currentPage") int currentPage,@PathVariable("pageSize") int pageSize) throws Exception{return dataService.search(keyWord,currentPage,pageSize);}

浏览器请求查看返回数据,如图

将返回的数据格式化下


```java
[{"price": 81.5,"name": "疯狂JAVA讲义(第5版)(含DVD光盘一张) 新华书店,正版保证,关注店铺成为会员可享店铺专属优惠,团购客户请咨询在线客服!"
}, {"price": 62.5,"name": "疯狂Java面试讲义 数据结构、算法与技术素养 图书 新华书店,正版保证,关注店铺成为会员可享店铺专属优惠,团购客户请咨询在线客服!"
}, {"price": 49.0,"name": "保证正版 疯狂JAVA讲义(第3版)(含CD光盘1张) 无 电子工业出版社 978712123669 现货直发,赠运费险。咨询客服关注店铺领取无门槛优惠券"
}, {"price": 65.4,"name": "疯狂Java讲义(第3版)(含光盘) ava从入门到精通 java编程思想java核心技术 新华书店,正版保证,关注店铺领取专属优惠,双旦季遇礼,全场满就送点击进入"
}]

和kibana查询出的结果比较下,结果完全一致
5.需要注意的点
(1)分页时from和size的含义
from:开始索引,代码传入当前页的话,from的值为(当前页-1)*每页的大小
size:每页的大小(从开始索引处返回的数据条数)
(2)创建索引库的时候需要指定字段的分词器和分词方式,否则将会按照默认的标准分词器进行分词,标准分词器分词中文的话是一个字一个词,并且通过termQuery查询中文的话,会差不多,其原因就是被查询的中文作为一个词,而索引库中是一个字一个词,自然是查不到的

爬虫京东数据作为索引库,模拟分页搜索相关推荐

  1. 导入图片后截取_微服务项目第36天:导入数据到索引库

    今天是刘小爱自学Java的第166天. 感谢你的观看,谢谢你. 学习计划安排,导入需要的数据到索引库: 对于all字段的拼接. spu中附带的skus集合. sku中对应的price. specs规格 ...

  2. (转)淘淘商城系列——导入商品数据到索引库

    http://blog.csdn.net/yerenyuan_pku/article/details/72902073 上文我们把商品数据导入到索引库中的Service层代码编写完了,本文我们将再来把 ...

  3. (转)淘淘商城系列——导入商品数据到索引库——Service层

    http://blog.csdn.net/yerenyuan_pku/article/details/72894187 通过上文的学习,我相信大家已经学会了如何使用Solrj来操作索引库.本文我们将把 ...

  4. 【微服务】166:导入数据到索引库

    目录 一.all数据 二.skus和price数据 三.specs规格参数 最后 今天是刘小爱自学Java的第166天. 感谢你的观看,谢谢你. 学习计划安排,导入需要的数据到索引库: 对于all字段 ...

  5. 【微服务】165:导入数据到索引库

    今天是刘小爱自学Java的第166天. 感谢你的观看,谢谢你. 学习计划安排,导入需要的数据到索引库: 对于all字段的拼接. spu中附带的skus集合. sku中对应的price. specs规格 ...

  6. (转)淘淘商城系列——导入商品数据到索引库——dao层

    http://blog.csdn.net/yerenyuan_pku/article/details/72889058 我们先来看看我们要导入数据的sql语句并且查看查询结果.  从上图可知我们需要从 ...

  7. 淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException

    问题描述 昨天碰到了一个问题,真的是把快我搞死了,导致我代码写下去的勇气都没有了,最后大爷我干脆不写了,我躺着睡觉还不行吗

  8. ES查看索引库结构和数据

    结构 #查看索引库 grid_cell_0代表索引库的名称 GET /grid_cell_0 数据 #查询索引库数据 grid_cell_0为索引库名称,_search固定,pretty是格式化数据 ...

  9. 微服务03 分布式搜索引擎 elasticsearch ELK kibana RestAPI 索引库 DSL查询 RestClient 黑马旅游

    分布式搜索引擎01 -- elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是 ...

最新文章

  1. spring学习(26):更优雅的依赖注入 在@bean注入参数
  2. 修改build:gradle版本
  3. gitee提交代码_git 版本控制,github和gitee
  4. .NET平台4.0 发布网站流程及出错总结
  5. “中国式”盗版该何去何从?
  6. TikZ学习笔记(一) 基本图形
  7. android 开发 切图,Android开发,切图网站推荐。
  8. C++ explicit禁止单参构造函数隐式调用
  9. 08.CXF发布WebService(Java项目)
  10. PHP上传文件到项目public路径接口
  11. 语言中预算符号的优先级_Perl语言入门系列之一
  12. 10 分钟上手 Vim 编辑器,常用命令大盘点!
  13. leetCode-458. Poor Pigs
  14. 澳洲计算机信息安全专业,澳洲网络信息安全专业有哪些牛校?本科硕士有哪些方向可以选择?...
  15. ASR6505基于STM 8位MCU与SX1262 的SiP全频段LoRa芯片
  16. 科普|掀开马甲包的 “神秘面纱”
  17. android dpi计算器,安卓多功能计算器 One++ Calculator 1.7.5 中文多语免费版
  18. 基于零日漏洞的自动驾驶预期功能安全风险评估方法
  19. Unity3D模型 | SolidWorks建模导入Unity
  20. 关于SQLの大题练习

热门文章

  1. 3分钟即可了解 FHub中转站文件摆渡新技能
  2. html5播放器绿屏修复,迅雷看看绿屏播放视频怎么修复
  3. 【Chaos Mesh官方文档】Chaosd Introduction
  4. 《三十六计》搞笑图解
  5. 【计算机毕业设计】323电子病历系统
  6. oracle数据库系统中启动数据库第一步,Oracle数据库基础题库【含答案】
  7. VVF格式监控录像数据恢复软件 V1.0
  8. 「CSS」Margin Collapsing - 外边距合并
  9. 十六进制“\u”开头字符串的转码
  10. ACP敏捷认证能学到什么?