环境:
- windows
- solr3.6.2下载:http://www.apache.org/dyn/closer.cgi/lucene/solr/3.6.2
- apache-tomcat-6.0.37下载:http://tomcat.apache.org/download-60.cgi#6.0.37
- ikanalyzer中文分词器下载:https://code.google.com/p/ik-analyzer/downloads/detail?name=IKAnalyzer3.2.8%20bin.zip
- luke3.5.0下载(可选):https://code.google.com/p/luke/downloads/detail?name=lukeall-3.5.0.jar
一、下载上述文件
二、tomcat发布solr配置
- 进入apache-tomcat-6.0.37\conf\Catalina\localhost 目录,新建 solr.xml ,内容如下:
<?xml version="1.0" encoding="utf-8"?> <Context docBase="D:\apache-tomcat-6.0.37\webapps\solr" reloadable="true" > <Environment name="solr/home" type="java.lang.String" value="D:\apache-tomcat-6.0.37\webapps\solr\solr" override="true" /> </Context>
- 将下载的apache-solr-3.6.2.zip 解压,进入apache-solr-3.6.2\dist 目录,将里面的apache-solr-3.6.2.war 复制到apache-tomcat-6.0.37\webapps 目录下面,并重命名为solr.war。
- 启动tomcat,系统会自动将 solr.war 进行解压,你会发现在 webapps 目录下面多了一个 solr的文件夹,然后停止tomcat服务,删除solr.war。
- 进入apache-solr-3.6.2\example 目录,将里面的solr文件夹复制到 apache-tomcat-6.0.37\webapps\solr 目录下,最后的完整目录应该是这样 apache-tomcat-6.0.37\webapps\solr\solr
- 修改 apache-tomcat-6.0.37\conf 目录下 server.xml 的编码,增加 URIEncoding="UTF-8"
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
- 启动tomcat,访问 http://localhost:8080/solr/admin/ 即可进入solr管理页面
三、增加ikanalyzer中文分词器
- 解压 IKAnalyzer3.2.8 bin.zip,将里面的 IKAnalyzer3.2.8.jar 放入到 apache-tomcat-6.0.37\webapps\solr\WEB-INF\lib 目录下;
- 进入apache-tomcat-6.0.37\webapps\solr\solr\conf 目录,在 schema.xml 中增加如下内容:
<!-- IKAnalyzer 中文分词-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" positionIncrementGap="100" autoGeneratePhraseQueries="true">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
四、solr使用配置
- 以下测试的Document中增加了2个新的Field(desc和address),需要在 apache-tomcat-6.0.37\webapps\solr\solr\conf 目录下的schema.xml中增加如下内容:
<field name="desc" type="text_ik" indexed="true" stored="true" />
<field name="address" type="text_ik" indexed="true" stored="true" multiValued="true" />
<!-- 设置查询的default value,方便查询时无需输入*:条件 -->
<field name="all_info" type="text_ik" indexed="true" stored="false" multiValued="true" />
<copyField source="name" dest="all_info" />
<copyField source="desc" dest="all_info" />
<copyField source="address" dest="all_info" />
- 修改apache-tomcat-6.0.37\webapps\solr\solr\conf 目录下的 solrconfig.xml 文件,修改查询的default value,将“df”修改为前面定义的"all_info":
<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">all_info</str>
</lst>
五、Java示例
执行如下代码需要的jar包的maven配置如下:
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>3.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient-cache</artifactId>
<version>4.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.1.3</version>
</dependency>
- SolrTest.java
package com.solr;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.SolrParams;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.beans.Index;
public class SolrTest {
private SolrServer server;
private static final String DEFAULT_URL = "http://localhost:8080/solr/";
@Before
public void init() {
try {
server = new HttpSolrServer(DEFAULT_URL);
} catch (Exception e) {
e.printStackTrace();
}
}
@After
public void destory() {
server = null;
}
public final void print(Object o) {
System.out.println(o);
}
@Test
/**
* 验证服务是否正常
*/
public void server() {
print(server);
}
@Test
/**
* 查询
*/
public void query() {
String query = "华星路";
SolrParams params = new SolrQuery(query);
try {
QueryResponse response = server.query(params);
SolrDocumentList list = response.getResults();
for (SolrDocument sd : list) {
print(sd);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void queryCase() {
SolrQuery params = new SolrQuery();
params.setQuery("华星路");
// 设置高亮
params.setHighlight(true);
params.addHighlightField("address");
params.setHighlightSimplePre("<font color='red'>");
params.setHighlightSimplePost("</font>");
params.setHighlightFragsize(2000);
try {
QueryResponse response = server.query(params);
SolrDocumentList list = response.getResults();
for (SolrDocument sd : list) {
String id = (String) sd.getFieldValue("id");
if (response.getHighlighting().get(id) != null) {
print(response.getHighlighting().get(id).get("address"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
/**
* 添加Document
*/
public void addDoc() {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", 1);
doc.addField("name", "张三");
doc.addField("desc", "我就是张三的张,张三的三");
doc.addField("address", new String[] { "浙江杭州市西湖区华星路99号创业大厦1楼",
"上海市长宁区天山西路123号" });
try {
UpdateResponse response = server.add(doc);
server.commit();
print(response);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 批量添加Document
*/
@Test
public void addDocs() {
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", 2);
doc1.addField("name", "李四");
doc1.addField("desc", "我就是李四的李,李四的四");
doc1.addField("address", new String[] { "浙江杭州市西湖区华星路86号",
"云南省大理市ABC路81号" });
docs.add(doc1);
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField("id", 3);
doc2.addField("name", "王五");
doc2.addField("desc", "我就是王五的王,王五的五");
doc2.addField("address",
new String[] { "浙江宁波市华星路16号", "新疆省乌鲁木齐市XX路64号" });
docs.add(doc2);
try {
UpdateResponse response = server.add(docs);
server.commit();
print(response);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除所有Document
*/
@Test
public void deleteAllDoc() {
try {
UpdateResponse response = server.deleteByQuery("*:*");
server.commit();
print(response);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据ID删除Document
*/
@Test
public void deleteById() {
try {
UpdateResponse response = server.deleteById("1");
server.commit();
print(response);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 添加JavaEntity Bean
*/
@Test
public void addBean() {
Index index = new Index();
index.setId("4");
index.setName("赵六");
index.setDesc("赵国的小六子");
index.setAddress(new String[] { "杭州市西湖区", "杭州市上城区", "杭州市下城区" });
try {
UpdateResponse response = server.addBean(index);
server.commit();
print(response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- Index.java
package com.beans;
import org.apache.solr.client.solrj.beans.Field;
public class Index {
@Field
private String id;
@Field
private String name;
@Field
private String desc;
@Field
private String[] address;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String[] getAddress() {
return address;
}
public void setAddress(String[] address) {
this.address = address;
}
}
六、luke使用
- 进入lukeall-3.5.0.jar的目录,执行【java -jar lukeall-3.5.0.jar】命令
- 打开solr 的索引文件所在目录 apache-tomcat-6.0.37\webapps\solr\solr\data\index,即可查看索引的详细情况