solr是全文检索企业级框架。
solr下载地址:http://archive.apache.org/dist/lucene/solr/
使用环境:JDK1.7以上、Tomcat 7以上
搭建solr服务器环境--window版
一、搭建solr服务器
1、创建“solr”文件夹 --- solr服务器目录。
2、把Tomcat和solr 4.10.3版本包放到solr服务器目录中。
3、到solr-4.10.3\example\webapps目录下找到solr.war包,复制到tomcat的webapps下并解压。因解压后的solr项目要修改,所有要删除war包,否则启动tomcat后,会覆盖原有的solr项目。
4、到solr-4.10.3\example\lib\ext目录下找到solr依赖包,复制到solr项目下WEB-INF的lib文件夹中。
5、在solr目录下创建solrHome文件夹 --- solr索引库(家)。把solr-4.10.3\example\solr目录下全部文件复制到solrHome中。
6、修改solr项目下WEB-INF的web.xml配置文件。把注释去掉,并指定solrHome(家)的路径,如下图:
7、启动tomcat,访问solr服务。
可能出现的问题,如果JDK环境不是1.7以上,启动tomcat会报错,错误如下;
JSR 356 WebSocket (Java WebSocket 1.1) support is not available when running on Java 6. To suppress this message, run Tomcat on Java 7, remove the WebSocket JARs from $CATALINA_HOME/lib or add the WebSocket JARs to the tomcat.util.scan.DefaultJarScanner.jarsToSkip property in $CATALINA_BASE/conf/catalina.properties. Note that the deprecated Tomcat 7 WebSocket API will be available.
访问solr后台管理页面:http://localhost:8080/solr
solr服务器搭建完成。
如果想在同一个solr服务中建立多库,可以把solrHome中collection1复制多份。比如两个库,复制后把文件夹名改成collection2,打开collection2的core.properties文件,修改name的值为collection2,重启tomcat服务。
二、配置IK中文分析器
1、下载IK中文分词器,IK中文分词器的更新版本只到2012年,所以IK中文分词器只支持solr 5之前的版本,solr6或以上的版本,中文分词器都不生效。除非到网上下载非官方的版本包。
2、把IK中文分析器的jar包复制到solr项目的WEB-INF\lib目录下。
3、把IKAnalyzer.cfg.xml和stopword.dic文件复制到solr项目的WEB-INF\classes目录下(创建classes文件夹)。
4、修改IKAnalyzer.cfg.xml文件,去除扩展字典的注释。
5、创建ext.dic文件,文件名称就是IKAnalyzer.cfg.xml中扩展字典里指定的名称。
6、扩展词汇和禁用词汇,ext.dic文件中填写的是扩展词汇,想进行分词的词语都可以写在文件中。stopword.dic文件中填写的是禁用词汇,不想进行分词的词语都可以写在这个文件中。
注意:修改文件stopword.dic,ext.dic的编码方式一定要是UTF-8无BOM的编码方式,不然分词器会失效,可以使用notepad++工具编译。
7、到solrHome\collection1\conf目录下的schema.xml文件中添加如下配置;
<fieldType name="text_ik" class="solr.TextField" >
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>
<field name="name_ik" type="text_ik" indexed="true" stored="true" />
8、验证IK中文分词器,“我”和“是”都是禁用词汇,分词中不会显示。“高富帅”是扩展词汇,会分词。
配置IK中文分词器完成。
三、数据库中数据导入solr索引库
1、导入jar包,solr-4.10.3\dist目录下找到solr-dataimporthandler-4.10.3.jar和solr-dataimporthandler-extras-4.10.3.jar复制到solrHome\collection1\lib目录下(创建lib文件夹),再把数据库驱动包复制到该目录下。
2、到solrHome\collection1\conf目录下的solrconfig.xml配置文件下添加如下配置;
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
3、到solrconfig.xml同目录下创建data-config.xml配置文件,在文件中添加如下配置;
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root"
password="123456" />
<document>
<entity name="product" query="select * from product">
<!--column为数据库字段名,name为solr索引库域名-->
<field column="pid" name="id" />
<field column="name" name="p_name" />
<field column="price" name="p_price" />
<field column="type" name="p_type" />
<field column="context" name="p_context" />
<field column="pic" name="p_pic" />
</entity>
</document>
</dataConfig>
4、在同目录下的schema.xml配置文件中给solr索引库新增域名,如下配置;
<!--id字段默认就有,不需要再配置。但注意id字段要配置required="true" ,表示增加索引时必须要给id值-->
<!--域名不能是关键字,比如name="name"-->
<field name="p_name" type="text_ik" indexed="true" stored="true" />
<field name="p_price" type="int" indexed="true" stored="true" />
<field name="p_type" type="string" indexed="true" stored="true" />
<field name="p_context" type="text_ik" indexed="true" stored="true" />
<field name="p_pic" type="string" indexed="true" stored="true" />
<!--多域字段要配置multiValued="true"-->
<field name="product_all" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="p_name" dest="product_all"/>
<copyField source="p_context" dest="product_all"/>
5、批量导入数据库数据到solr索引库
批量导入数据到solr索引库完成。
四、测试项目
solr客户端项目环境也要是JDK1.7以上、tomcat7以上
1、在spring或springmvc配置文件中配置solrJ,交给spring容器管理。
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<!-- 构造器传参,把solr服务地址传进来 -->
<constructor-arg value="http://localhost:8080/solr"></constructor-arg>
</bean>
也可以不用在配置文件中配置,直接在程序中创建对象
String baseURL = "http://localhost:8080/solr";
SolrServer server = new HttpSolrServer(baseURL);
2、测试类
package com.jd.dao;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.jd.bean.Product;
@Repository
public class JDDao {
@Autowired
private SolrServer solrServer;
/**
* 新增
*/
public void testAdd() throws Exception{
// String baseURL = "http://localhost:8080/solr";
// SolrServer server = new HttpSolrServer(baseURL);
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "lala");
doc.addField("name", "wangwei");
solrServer.add(doc, 1000);
}
/**
* 删除
*/
public void testDel() throws Exception{
// String baseURL = "http://localhost:8080/solr";
// SolrServer server = new HttpSolrServer(baseURL);
solrServer.deleteByQuery("id:lala", 1000);
}
/**
* 查询
*/
public List<Product> getQuery(String pName, String pPrice, String pContext, String pType) throws Exception{
// String baseURL = "http://localhost:8080/solr";
// SolrServer server = new HttpSolrServer(baseURL);
SolrQuery solrQuery = new SolrQuery();
//关键字
if(pName == null || "".equals(pName.trim())){
pName = "*";
}
solrQuery.setQuery(pName);
StringBuffer sb = new StringBuffer();
//过滤条件(商品内容、商品类型、商品价格)
if(pContext != null && !"".equals(pContext.trim())){
sb.append("p_context:" + pContext).append(",");
}
if(pType != null && !"".equals(pType.trim())){
sb.append("p_type:" + pType).append(",");
}
if(pPrice != null && !"".equals(pPrice.trim())){
String[] split = pPrice.split("-");
sb.append("p_price:[" + split[0] + " TO " + split[1] + "]");
}
//过滤条件要放到数组中,solrQuery.setFilterQueries才能处理
if(!"".equals(sb.toString())){
String[] fqs = sb.toString().split(",");
solrQuery.setFilterQueries(fqs);
}
//价格排序
solrQuery.setSort("p_price", ORDER.desc);
//分页
solrQuery.setStart(0);
solrQuery.setRows(16);
//默认域,注释标识查询所有域
// solrQuery.setFields("id,p_name,p_price,p_type,p_context");
//默认查询指定域
solrQuery.set("df", "p_name");
//高亮
//打开高亮
solrQuery.setHighlight(true);
//指定要高亮的域
solrQuery.addHighlightField("p_name");
solrQuery.addHighlightField("p_context");
//指定添加的样式 前缀
solrQuery.setHighlightSimplePre("<span style='color:red'>");
//后缀
solrQuery.setHighlightSimplePost("</span>");
//执行查询
QueryResponse response = solrServer.query(solrQuery);
//查询结果集
SolrDocumentList results = response.getResults();
//查询高亮结果集
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
List<Product> products = new ArrayList<Product>();
for (SolrDocument solrDocument : results) {
Product product = new Product();
product.setId(solrDocument.get("id") + "");
product.setpName(solrDocument.get("p_name") + "");
product.setpPrice(solrDocument.get("p_price") + "");
product.setpType(solrDocument.get("p_type") + "");
product.setpPic(solrDocument.get("p_pic") + "");
//商品内容p_context要用高亮方式在页面上显示,所以在存p_context时,直接到高亮结果集中获取。
Map<String, List<String>> map = highlighting.get(solrDocument.get("id"));
List<String> list = map.get("p_context");
product.setpContext(list.get(0));
products.add(product);
}
return products;
}
}