solr学习之旅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值