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"));
}
}