Linux下solr的安装与使用

一、solr介绍

1.1 背景

在一些大型门户网站、电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快、搜索结果按相关度排序、搜索内容格式不固定等,这里就需要使用全文检索技术实现搜索功能

1.2 solr实现

基于Solr实现站内搜索扩展性较好并且可以减少程序员的工作量,因为Solr提供了较为完备的搜索引擎解决方案,因此在门户、论坛等系统中常用此方案

1.3 什么是solr

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。
Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况

1.4 solr与Lucene的区别

Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。
Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。
在这里插入图片描述

二、Linux下solr安装过程

2.1 solr的环境

solr是Java开发的,需要安装jdk和tomcat

2.2 解压solr安装包

在这里插入图片描述在这里插入图片描述

2.3 将solr部署到tomcat上

为了便于区分,将tomcat放在了/usr/local/solr/文件加下
在这里插入图片描述将solr的war包部署到Tomcat上
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.4 启动Tomcat

在这里插入图片描述
此时solr的war包已经解压缩了
在这里插入图片描述
然后关闭tomcat
删除solr.war
在这里插入图片描述

2.5 拷贝solr启动需要的jar包

jar包位置:example/lib/ext/下的所有jar包
在这里插入图片描述在这里插入图片描述

2.6 拷贝solrhome

/example/solr目录就是一个solrhome。复制此目录到/usr/local/solr/solrhome
在这里插入图片描述在这里插入图片描述

2.7 关联solr及solrhome

需要修改solr工程的web.xml文件
在这里插入图片描述
注释去掉,路径修改
在这里插入图片描述

2.8 启动Tomcat

在这里插入图片描述在这里插入图片描述启动成功

三、配置业务域

3.1 把中文分析器添加到工程中

把IKAnalyzer2012FF_u1.jar添加到solr工程的lib目录下
在这里插入图片描述
在这里插入图片描述
把扩展词典、配置文件放到solr工程的WEB-INF/classes目录下
首先创建classes文件夹
在这里插入图片描述在这里插入图片描述在这里插入图片描述

3.2 配置一个FieldType,指定使用IKAnalyzer

在solrhome文件下找到schema.xml文件
在这里插入图片描述编辑
在这里插入图片描述在文件末尾添加FieldType,并配置自定义的业务域
在这里插入图片描述

3.3 重启tomcat,使业务域生效

在这里插入图片描述

四、在项目中操作索引库

4.1 添加索引库

导入对应的solej架包之后,就可以往索引库中添加索引了

	@Test
	public void  addDocument() throws Exception{
		//创建一个solrservice对象,创建一个连接,参数solr服务的url
		SolrServer solrServer = new HttpSolrServer("http://192.168.12.128:8080/solr/collection1");
		//创建一个文档对象SolrInputDocument
		SolrInputDocument document = new SolrInputDocument();
		//向文档对象中添加域,文档中必须包含一个id域,所有域的名称必须在shema.xml中定义
		document.addField("id", "doc01");
		document.addField("item_title", "测试商品01");
		document.addField("item_price", 1000);
		//把文档写入索引库
		solrServer.add(document);
		//提交
		solrServer.commit();
	}

在这里插入图片描述

4.2 更新索引库

更新与添加一样 只要id一样,就会先删除再添加

	@Test
	public void  editDocument() throws Exception{
		//创建一个solrservice对象,创建一个连接,参数solr服务的url
		SolrServer solrServer = new HttpSolrServer("http://192.168.12.128:8080/solr/collection1");
		//创建一个文档对象SolrInputDocument
		SolrInputDocument document = new SolrInputDocument();
		//向文档对象中添加域,文档中必须包含一个id域,所有域的名称必须在shema.xml中定义
		document.addField("id", "doc01");
		document.addField("item_title", "修改索引商品01");
		document.addField("item_price", 1000);
		//把文档写入索引库
		solrServer.add(document);
		//提交
		solrServer.commit();
	}

在这里插入图片描述

4.3 删除索引库

	@Test
	public void  deleteDocument() throws Exception{
		//创建一个solrservice对象,创建一个连接,参数solr服务的url
		SolrServer solrServer = new HttpSolrServer("http://192.168.12.128:8080/solr/collection1");
		//删除文档 两种方法一样,根据id删、查询删
		//solrServer.deleteById("doc01");
		solrServer.deleteByQuery("id:doc01");
		//提交
		solrServer.commit();
	}

在这里插入图片描述

4.4 查询索引库

简单查询

	@Test
	//简单查询
	public void queryIndex() throws Exception{
		//创建一个solrServer对象
		SolrServer solrServer = new HttpSolrServer("http://192.168.12.128:8080/solr/collection1");
		//创建一个solrQuery对象
		SolrQuery solrQuery = new SolrQuery();
		//设置查询条件
		solrQuery.setQuery("*:*");
		solrQuery.set("q", "*:*");
		//执行查询,QueryResponse对象
		QueryResponse queryResponse = solrServer.query(solrQuery);
		//取文档列表,取查询结果的总记录数
		SolrDocumentList solrDocumentList = queryResponse.getResults();
		System.out.println("查询结果总记录数:" + solrDocumentList.getNumFound());
		//遍历文档列表,从取域的内容
		for (SolrDocument solrDocument : solrDocumentList) {
			System.out.println(solrDocument.get("id"));
			System.out.println(solrDocument.get("item_title"));
			System.out.println(solrDocument.get("item_sell_point"));
			System.out.println(solrDocument.get("item_price"));
			System.out.println(solrDocument.get("item_image"));
			System.out.println(solrDocument.get("item_category_name"));
		}
	}

复杂查询

	@Test
	//复杂查询
	public void queryIndexFuZa() throws Exception{
		//创建一个solrServer对象
		SolrServer solrServer = new HttpSolrServer("http://192.168.12.128:8080/solr/collection1");
		//创建一个solrQuery对象
		SolrQuery solrQuery = new SolrQuery();
		//设置查询条件
		solrQuery.setQuery("手机"); //查询条件
		solrQuery.setStart(0); //分页条件
		solrQuery.setRows(20);
		solrQuery.set("df", "item_title"); //搜索域
		solrQuery.setHighlight(true); //高亮显示
		solrQuery.addHighlightField("item_title"); //高亮显示的域
		solrQuery.setHighlightSimplePre("<em>"); //前缀
		solrQuery.setHighlightSimplePost("</em>"); //后缀
		
		//执行查询,QueryResponse对象
		QueryResponse queryResponse = solrServer.query(solrQuery);
		//取文档列表,取查询结果的总记录数
		SolrDocumentList solrDocumentList = queryResponse.getResults();
		System.out.println("查询结果总记录数:" + solrDocumentList.getNumFound());
		//遍历文档列表,从取域的内容
		for (SolrDocument solrDocument : solrDocumentList) {
			System.out.println(solrDocument.get("id"));
			//取高亮显示
			Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
			List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
			String title = "";
			if (list != null && list.size() > 0) {
				title = list.get(0);
			} else {
				title = (String) solrDocument.get("item_title");
			}
			System.out.println(title);
			System.out.println(solrDocument.get("item_sell_point"));
			System.out.println(solrDocument.get("item_price"));
			System.out.println(solrDocument.get("item_image"));
			System.out.println(solrDocument.get("item_category_name"));
		}
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值