一、solr介绍
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务
solr.war包是一个java web程序,需要运行在tomcat中
二、安装步骤
1. 安装jdk + tomcat
2. 在/usr/local创建一个solr目录
3. 解压solr压缩包
4. 把solr-4.10.3/dist/solr-4.10.3.war包部署到tomcat下,并改名为solr.war
cp solr-4.10.3/dist/solr4.10.3.war/ usr/local/solr/tomcat/webapps/solr.war
5. 把/solr-4.10.3/example/lib/ext 目录下所有的jar包复制到solr工程中
cp * /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
6. 创建solrhome。Solrhome是存放solr服务器所有配置文件的目录
在example文件夹内,把solr文件夹复制到/usr/local/solr/solrhome
[root@localhost example]# pwd
/home/ftp-userliu/solr-4.10.3/example
[root@localhost example]# cp -r solr /usr/local/solr/solrhome
7. 需要修改solr工程的web.xml文件。(实际配置的是JNDI),目的是告诉solr,solrhome的位置
cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/
vim web.xml
8. 启动tomcat
地址栏输入:http://192.168.172.129:8080/solr/#/
三、配置业务字段
(1)中文分析器的配置
1. 使用IK-Analyzer。把分析器的文件夹上传到服务器
2. 把分析器的jar包添加到solr工程中
cp IKAnalyzer2012FF_u1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
3. 把IKAnalyzer需要的扩展词典及停用词词典、配置文件复制到solr工程的classpath
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes
注意:扩展词典及停用词词典的字符集必须是utf-8。不能使用windows记事本编辑
4. 配置fieldType。需要在solrhome/collection1/conf/schema.xml中配置
在末尾加上:
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
这里一定要用TextField,因为它能分词。(分词:我真的不喜欢你 ——> 我,真的,不,喜欢,你)
(2)配置业务字段
业务字段判断标准:
1、在搜索时是否需要在此字段上进行搜索。例如:商品名称、商品的卖点、商品的描述
2、后续的业务是否需要用到此字段。例如:商品id
假设现在需要如下字段:
1、商品id
2、商品title
3、卖点
4、价格
5、商品图片
6、商品分类名称
7、商品描述
则需要在schema.xml配置:
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="long" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category_name" type="string" indexed="true" stored="true" />
<field name="item_desc" type="text_ik" indexed="true" stored="false" />(商品描述用作搜索,不需要表现给用户,因此stored=”false”)
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>(复制域,好处,将我们需要搜索的字段放在一个域中,有利于提高效率)
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
<copyField source="item_category_name" dest="item_keywords"/>
<copyField source="item_desc" dest="item_keywords"/>
重新启动tomcat之后,发现solr中已经有了配置的业务字段
四、维护索引库
1. 添加数据
查询数据
2. 更新数据
在solr中没有update,只需要添加一个新的文档,要求文档id和被修改文档的id一致。原理是先删除后添加。
3. 删除数据
五、Java整合Solr
使用maven依赖solrJ包
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
</dependency>
增加和删除:
public class SolrJTest {
@Test
public void addDocument() throws Exception {
//创建一连接
SolrServer solrServer = new HttpSolrServer("http://192.168.172.129:8080/solr");
//创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "test001");
document.addField("item_title", "测试商品2");
document.addField("item_price", 54321);
//把文档对象写入索引库
solrServer.add(document);
//提交
solrServer.commit();
}
@Test
public void deleteDocument() throws Exception {
//创建一连接
SolrServer solrServer = new HttpSolrServer("http://192.168.172.129:8080/solr");
//两种删除方式
solrServer.deleteById("test001");
//solrServer.deleteByQuery("*:*");
solrServer.commit();
}
}
查询:
@Test
public void queryDocument() throws Exception {
SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
//创建一个查询对象
SolrQuery query = new SolrQuery();
//设置查询条件
query.setQuery("*:*");
query.setStart(20);
query.setRows(50);
//执行查询
QueryResponse response = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = response.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_price"));
System.out.println(solrDocument.get("item_image"));
}
}