玩转搜索(二)-- Solr实战

什么是Solr

Solr是一个独立的企业级搜索应用服务器,它对外提供API接口。

  • 用户通过HTTP的POST请求,向Solr服务器提交一定格式的XML或JSON文件,Solr服务器解析文件后,根据具体需求对索引库执行增删改操作;
  • 用户通过HTTP的GET请求,向Solr服务器发送搜索请求,并得到XML/JSON格式的返回结果。

Solr可以独立运行在Jetty、Tomcat等Servlet容器中。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

Solr配置

下载最新版本的Solr 8.7 ,解压后得到如下目录:

启动Solr服务器

.\bin\solr.cmd start

关闭Solr服务器

.\bin\solr.cmd stop -all

访问本地服务 http://localhost:8983/solr/#/

创建新的SolrCore

SolrCore类似于传统MySql中的数据库概念。

  1. 在\server\solr下新建文件夹lwtx_demo
  2. 将\server\solr\configsets\_default\conf下文件拷贝到\server\solr\lwtx_demo下
  3. 在Core Admin里新建一个 Add Core

至此,在Core Selector里会出现新的lwtx_demo,选择这个SolrCore,后续的操作都会在这个SolrCore里进行。

如何同步MySql数据

将mysql驱动、solr-dataimporthandler-8.7.0.jar、solr-dataimporthandler-extras-8.7.0.jar 拷贝至\server\solr-webapp\webapp\WEB-INF\lib

在solrconfig.xml文件中,加入dataimport的Handle

  <requestHandler name="/dataimport" class="solr.DataImportHandler"> 
    <lst name="defaults"> 
      <str name="config">db-data-config.xml</str> 
    </lst> 
  </requestHandler>

在\server\solr\lwtx_demo下新建配置文件db-data-config.xml

<dataConfig>
    <dataSource type="JdbcDataSource" 
        driver="com.mysql.cj.jdbc.Driver" 
        url="jdbc:mysql://localhost:3306/dev-tesing-rds?serverTimezone=UTC" 
        user="demo" password="123456"/>
    <document>
        <entity name="demo" query="SELECT id,name from demo">
            <field column="id" name="solr_id" />
			<field column="name" name="solr_name" />
        </entity>
    </document>
</dataConfig>

在managed-schema文件中新增field

   <field name="solr_id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   <field name="solr_name" type="string" indexed="true" stored="true" />  

至此可以实现import功能

Java代码实战

Solrj是访问Solr服务器的Java客户端,提供索引和搜索的方法。

依赖包

<!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj -->
<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>8.7.0</version>
</dependency>

导入数据

            String solrUrl = "http://localhost:8983/solr/lwtx_demo/";

			//创建Solr的客户端连接对象
			SolrClient solrServer = new HttpSolrClient.Builder(solrUrl).build();
			
			// TODO 模拟初始化数据
			List<Product> productList = new ArrayList<>();

			// 创建文档
			List<SolrInputDocument> docs = new ArrayList<>();
			SolrInputDocument doc;
			for (Product product : productList) {
				doc = new SolrInputDocument();
				doc.addField("id", product.getPid());
				doc.addField("product_name", product.getName());
				doc.addField("product_catalog_name", product.getCatalog_name());
				doc.addField("product_price", product.getPrice());
				doc.addField("product_description", product.getDescription());
				doc.addField("product_picture", product.getPicture());
				docs.add(doc);
			}
			// 先清空索引库
			solrServer.deleteByQuery("*:*");
			// 再索引文档
			solrServer.add(docs);
			solrServer.commit();

查询数据

		String solrUrl = "http://localhost:8983/solr/lwtx_demo/";

		//创建Solr的客户端连接对象
		SolrClient solrServer = new HttpSolrClient.Builder(solrUrl).build();

		// 创建SolrQuery对象
		SolrQuery solrQuery = new SolrQuery();

		// 设置查询关键词
		if (StringUtils.hasLength(queryString)) {
			solrQuery.setQuery(queryString);
		} else {
			solrQuery.setQuery("*:*");
		}
		// 设置默认域
		solrQuery.set("df", "product_keywords");

		// 设置商品类名过滤条件
		// 设置商品分类名称
		if (StringUtils.hasLength(catalog_name)) {
			catalog_name = "product_catalog_name:" + catalog_name;
		}

		// 设置商品价格
		if (StringUtils.hasLength(price)) {
			String[] sp = price.split("-");
			if (sp != null && sp.length == 2) {
				price = "product_price:[" + sp[0] + " TO " + sp[1] + "]";
			}
		}
		solrQuery.setFilterQueries(catalog_name, price);

		// 商品排序,如果是1,正序排序,如果是其他,则倒序排序
		if ("1".equals(sort)) {
			solrQuery.setSort("product_price", ORDER.asc);
		} else {
			solrQuery.setSort("product_price", ORDER.desc);
		}

		// 设置分页
		if (page == null) {
			page = 1;
		}
		solrQuery.setStart((page - 1) * 20);
		solrQuery.setRows(20);

		// 设置高亮
		solrQuery.setHighlight(true);
		solrQuery.addHighlightField("product_name");
		solrQuery.setHighlightSimplePre("<font color='red'>");
		solrQuery.setHighlightSimplePost("</font>");

		// 查询数据
		QueryResponse response = solrServer.query(solrQuery);

		// 获取查询总数
		SolrDocumentList results = response.getResults();
		long total = results.getNumFound();

		// 获取高亮数据
		Map<String, Map<String, List<String>>> map = response.getHighlighting();

		// 解析结果集,存放到Product中
		List<Product> products = new ArrayList<>();
		for (SolrDocument solrDocument : results) {
			Product product = new Product();
			// 商品id
			product.setPid(solrDocument.get("id").toString());
			// 商品标题,设置高亮
			List<String> list = map.get(solrDocument.get("id")).get("product_name");
			if (list != null && list.size() > 0) {
				product.setName(list.get(0));
			} else {
				product.setName(solrDocument.get("product_name").toString());
			}
			// 商品价格
			product.setPrice(solrDocument.get("product_price").toString());
			// 商品图片
			product.setPicture(solrDocument.get("product_picture").toString());

			products.add(product);
		}

		// 封装返回对象
		Result result = new Result();

		result.setCurPage(page);
		result.setRecordCount(total);
		result.setProductList(products);
		// 总页数计算公式(total+rows-1)/rows
		result.setPageCount((int) (total + 20 - 1) / 20);

		return result;

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
    本课程全程使用目前比较流行的开发工具idea进行开发,涉及到目前互联网项目中最常用的高并发解决方案技术, 如dubbo,redis,solr,freemarker,activeMQ,springBoot框架,微信支付,nginx负载均衡,电商活动秒杀,springSecurity安全框架,FastDFS分布式文件服务器,还会涉及到代码生成器,   前台的技术有angularJS和BootStrap框架,此课程内容丰富实战性强,如果你还是传统项目的开发人员,那你学完本课程会有很大的收获,让你的薪资上涨,5K以上,让你完全感受到了互联网思维带来的高 并发解决方案的思路,如果你是开发的小白,建议你学完Spring,SpringMVC,MyBatis框架后再来学习本门课程,学完以后会让你完全体验到企业级开发的流程.在职开发人员学完后会让你的薪资更高,让你更了解互联网是如何解决高并发 学完SSM框架的同学就可以学习,能让你切身感受到企业级开发环境目标1:完成solr环境安装、中文分析器和业务域的配置目标2:会使用Spring Data Solr完成增删改查操作目标3:完成批量数据导入功能目标4:完成按关键字搜索功能目标5:实现考拉易购搜索结果高亮显示功能目标6:说出考拉易购搜索的业务规则和实现思路目标7:完成查询分类列表的功能目标8:完成缓存品牌和规格数据的功能目标9:完成显示品牌和规格数据的功能目标10:完成过滤条件构建的功能目标11:完成过滤查询的功能目标11:实现考拉易购价格区间筛选功能目标12:实现搜索结果分页功能目标13:理解多关键字搜索目标14:实现搜索结果排序功能目标15:实现隐藏品牌列表功能目标16:实现搜索页与首页对接功能目标17:完成更新索引库的功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值