solr的基本使用个人总结
solr和lucence的区别:
lucence:基于java开发的全文检索API,需要自己管理和维护索引库、索引库的优化、缓存的添加
solr:基于lucence的全文检索服务器,能帮助我们维护索引库,自动完成缓存的添加等
solr服务器的搭建流程:
1.首先服务器中需要有jdk自行安装即可(百度教程很多)
2.将途中的压缩包放到服务器中(ALT+P 然后直接将文件拖进去)
3.此时系统目录会有solr压缩包,执行解压命令: tar zxf solr-4.10.3.tgz.tgz
4.执行解压命令之后,将解压后的文件复制到指定目录下
5.将solr文件中的solr-4.10.3.war复制到tomcat的webapps目录下
6.启动tomcat之后 .war文件将会自动解压,第二句是查看控制台语句
7.将 solr-4.10.3中 example/lib/ext/目录下的所有jar包复制到指定目录下
8.配置solrhome
9.把solrhome的地址告诉solr,推介修改solr的web.xml即可
solr导入索引库,可以用数据库的id,相当于solr中的主键,id不重复正好可以用
导入索引库的流程:
1.将中文分词器导入到服务器
2.将IK文件中的IKAnalyzer2012FF_u1.jar复制到指定目录
3.需要将下图中的文件放到classes目录下,没有那就创建即可
复制
4. 在cd /usr/local/solr/solrhome/目录下 定义filed Type
schema.xml中定义了solr中所有的域
5.在schema.xml文件的末尾指定自定义中文分词器
6.定义自己的业务域
中文分词器的作用就是根据内容的一部分来搜索内容
注:String-field类型不分词,但是建立索引,例如订单号之类的
text-field既分词也建立索引,是否存储取决于参数
(可选择配置或不配置都可以)复制域,将所有的域复制过来统一管理,它包含其他域的全部内容,通过一个关键字搜索就行
这一步结束,业务域就配置完成了
然后重启tomcat
导入索引库:
新建一个taotao-searchmaven工程 打包pom
在新建一个maven模块taotao-search-interface 打包jar
新建一个maven模块taotao-search-service 打包war
然后参考taotao-content进行配置
配置taotao-search-interface ,pom文件对应content工程修改即可
由于是多表查询,需要自己写mapper映射文件的SQL语句 例:
SELECT
a.`id`,
a.`title`,
a.`sell_point`,
a.`price`,
a.`image`,
b.`name` category_name,
c.`item_desc`
FROM tb_item a
LEFT JOIN tb_item_cat b ON a.cid=b.id
LEFT JOIN tb_item_desc c ON a.id=c.item_id
WHERE a.`status`=1
自定义mapper文件的创建 可以参考随后更新的文章
下面接着说solrj(solr的java客户端的使用)
》导入solrj依赖
》编写测试代码
package com.taotao.solrj;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
public class TestSolrJ {
//添加索引
@Test
public void TestAddDocument() throws Exception{
//创建一个solrserver(抽象类)创建一个单机版HttpsolrServer对象
//需要指定solr服务的url
SolrServer solrServer=new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//创建一个文档对象SolrInputDocument
SolrInputDocument document=new SolrInputDocument();
//向文档中添加域,必须有id域,域的名称必须在schema.xml文件中指定
document.addField("id", "test001");
document.addField("item_title", "测试商品");
document.addField("item_price", 1000);
//把文档对象写入索引库
solrServer.add(document);
// 提交
solrServer.commit();
}
}
》浏览器客户端的查询结果,显示已经添加成功
》删除索引
**
* 根据id删除
* @throws Exception
*/
@Test
public void deleteDocumentById()throws Exception{
//创建一个solrserver(抽象类)创建一个单机版HttpsolrServer对象
//需要指定solr服务的url
SolrServer solrServer=new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//执行删除
solrServer.deleteById("test001");
//提交
solrServer.commit();
}
/**
* 根据查询删除
* @throws Exception
*/
@Test
public void deleteDocumentByQuery()throws Exception{
//创建一个solrserver(抽象类)创建一个单机版HttpsolrServer对象
//需要指定solr服务的url
SolrServer solrServer=new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
solrServer.deleteByQuery("id:123");
//提交
solrServer.commit();
}
使用solrJ进行查询搜索的示例:
@Test
public void searchDocument()throws Exception{
//创建一个Solrserver对象
SolrServer solrServer=new HttpSolrServer("http://192.168.25.128:8080/solr/collection1");
//创建一个solrQuery对象
SolrQuery query=new SolrQuery();
//设置查询条件,过滤条件,分页条件,排序条件,高亮显示
//set方法是一个通用方法,什么属性都可以设置
//query.set("q", "*:*");
//分页条件
query.setQuery("手机");//查询条件
query.setStart(30);//起始记录数
query.setRows(20);//每页显示的记录数
//设置默认搜索域
query.set("df", "item_keywords");
//设置高亮
query.setHighlight(true);
//高亮显示的域
query.addHighlightField("item_title");
query.setHighlightSimplePre("<div>");//前缀
query.setHighlightSimplePost("<div>");//后缀
//执行查询,得到一个Response对象
QueryResponse response = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = response.getResults();//是一个ArrayList,可遍历
//取查询结果总记录数
System.out.println("查询结果总记录数: "+solrDocumentList.getNumFound());
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
//取高亮显示
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
String itemTitle="";
if(list!=null&&list.size()>0){
itemTitle=list.get(0);
}else{
itemTitle = (String) solrDocument.get("item_title");
}
System.out.println(itemTitle);
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"));
System.out.println("------------------------------------------------------");
}
}