---
title: solr搜索服务器
date: 2017-03-03 00:05:13
update: 2017-03-05 00:05:13
categories: JAVA
tags: [java, solr, linux]
---
### 1 windows下使用solr
#### 1.1 解压solr-4.10.2.zip文件
cmd进入D:\solr-4.10.2\example目录
执行启动命令
```
D:\solr-4.10.2\example>java -jar start.jar
```
启动成功,浏览器访问
访问url: http://127.0.0.1:8983
修改D:\solr-4.10.2\example\contexts\solr-jetty-context.xml文件
```
```
通过nginx代理通过域名客直接访问。
#### 1.2 创建指定的项目solr core
1、 在example目录下创建taotao-solr文件夹;
2、 将./solr下的solr.xml拷贝到taotao-solr目录下;
3、 在taotao-solr下创建taotao目录,并且在taotao目录下创建conf和data目录;
4、 将example\solr\collection1\core.properties文件拷贝到example\taotao-solr\taotao下,并且修改name=taotao;
5、 将example\solr\collection1\conf下的schema.xml、solrconfig.xml拷贝到example\taotao-solr\taotao\conf下;
6、 修改schema.xml文件,使其配置最小化:
```xml
id
```
7、修改solrconfig.xml文件,修改一些配置,大部分配置先保持默认:
a) 将所有的标签注释掉;
b) 搜索text 替换成title
c) 将 这部分注释掉(这个的功能类似百度的竞价排名)
8、启动solr:
```
java -Dsolr.solr.home=taotao-solr -jar start.jar
```
#### 1.3 添加IK中文分词器的支持
1、 将IKAnalyzer-2012-4x.jar拷贝到example\solr-webapp\webapp\WEB-INF\lib下;
2、 在schema.xml文件中添加fieldType:
### 2 导入项目中需要加入到solr的数据
需要使用solr搜索服务的数据应先存放到solr中。
解析数据参考:jackson解析字符串
```java
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import cn.itcast.solrj.pojo.Item;
public class ItemDataImportTest {
private HttpSolrServer httpSolrServer;
private static final ObjectMapper MAPPER = new ObjectMapper();
@Before
public void setUp() throws Exception {
// 在url中指定core名称:taotao
// http://solr.taotao.com/#/taotao -- 界面操作
String url = "http://solr.taotao.com/taotao"; // 服务地址
HttpSolrServer httpSolrServer = new HttpSolrServer(url); // 定义solr的server
httpSolrServer.setParser(new XMLResponseParser()); // 设置响应解析器
httpSolrServer.setMaxRetries(1); // 设置重试次数,推荐设置为1
httpSolrServer.setConnectionTimeout(500); // 建立连接的最长时间
this.httpSolrServer = httpSolrServer;
}
@Test
public void testData() throws Exception {
// 通过后台系统的接口查询商品数据
String url = "http://manage.taotao.com/rest/item?page={page}&rows=100";
int page = 1;
int pageSzie = 0;
do {
String u = StringUtils.replace(url, "{page}", "" + page);
System.out.println(u);
String jsonData = doGet(u);
JsonNode jsonNode = MAPPER.readTree(jsonData);
String rowsStr = jsonNode.get("rows").toString();
List- items = MAPPER.readValue(rowsStr, MAPPER.getTypeFactory().constructCollectionType(List.class, Item.class));
pageSzie = items.size();
this.httpSolrServer.addBeans(items);
this.httpSolrServer.commit();
page++;
} while (pageSzie == 100);
}
private String doGet(String url) throws Exception {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
// 创建http GET请求
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = null;
try {
// 执行请求
response = httpclient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
return EntityUtils.toString(response.getEntity(), "UTF-8");
}
} finally {
if (response != null) {
response.close();
}
httpclient.close();
}
return null;
}
@Test
public void testData2() throws Exception {
//
Item item = new Item();
item.setCid(1L);
item.setId(111L);
item.setImage("http://image.taotao.com/jd/4ef8861cf6854de9889f3db9b24dc371.jpg");
item.setPrice(299000L);
item.setSellPoint("清仓!仅北京,武汉仓有货!");
item.setStatus(1);
item.setTitle("阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待");
item.setUpdated(System.currentTimeMillis());
this.httpSolrServer.addBean(item);
this.httpSolrServer.commit();
}
}
```
### 3 spring整合solr搜索
#### 3.1 引入solr客户端jar包solrj
```
org.apache.solr
solr-solrj
4.10.2
```
#### 3.2 solr.properties属性配置文件
```
solr.url=http://solr.taotao.com/taotao
solr.maxRetries=1
solr.connectionTimeout=500
```
#### 3.3 taotao-search-servlet.xml文件中初始化solr.properties文件
```xml
```
#### 3.4 applicationContext-solr.xml文件spring整合solr文件
```xml
```
#### 3.5 配置nginx代理
```xml
server {
listen 80;
server_name search.volc.cn;
#charset koi8-r;
#access_log logs/host.access.log main;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
location / {
proxy_pass http://127.0.0.1:8085;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
```
#### 3.6 项目中搜索商品数据的接口(含分页)
接口访问solr服务接口示例
#### 3.7 解决乱码问题
get请求使用spring配置过滤是解决不了的。
接口中对数据重新编码:
```java
// 解决GET前段传入参数的编码格式为utf-8
keyWords = new String(keyWords.getBytes("ISO-8859-1"), "UTF-8");
```
### 4 Linux下部署搜索项目
修改
nginx solr.taotao.com
启动solr
java -jar start.jar
浏览器访问
solr.taotao.com/solr
修改D:\solr-4.10.2\example\contexts\solr-jetty-context.xml文件
```
```
目的是可以solr.taotao.com这样访问
放置独立的搜索项目
启动方式
```
cd D:\solr-4.10.2\example
java -Dsolr.solr.home=taotao-solr -s jar start.jar
```
因为linux系统中有java运行环境,只需要复制本地solr中的D:\solr-4.10.2\example文件夹下的文件和文件夹
```
切换到ucenter用户;
mkdir /ucenter/web/
# 上传taotao-solr-4.10.1.tar.gz
rz
tar –xvf taotao-solr-4.10.1.tar.gz
# 修改/ucenter/web/example目录为/ucenter/web/taotao-solr
mv example taotao-solr
cd taotao-solr/
# 启动solr,在linux系统中使用&符号,代表服务在后台运行,ctrl + c后查看进程,solr仍然是启动状态
# 类似redis中redis.conf里的daemonize yes,意思是作为后台启动配置
java -Dsolr.solr.home=taotao-solr -jar start.jar &
# 输出结果有8861,这个就是启动solr的进程号
# 开放8983solr默认端口号,这里和本地一样是通过nginx代理访问的
# nginx.conf配置solr访问端口
server {
listen 80;
server_name solr.taotao.com;
#charset koi8-r;
#access_log logs/host.access.log main;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
location / {
proxy_pass http://安装solr所在的服务器ip:8983;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
/sbin/iptables -I INPUT -p tcp --dport 8983 -j ACCEPT
/etc/rc.d/init.d/iptables save
# 查看solr进程
ps -ef | grep java
```
solr搜索服务器