solr4.8.1
全文搜索服务器
下载solr–>Lucene3.5.0(solr3.5.0)
SolrJ
solr wiki
1、Solr4.8.1整合到Tomcat中并添加MMSeg4j中文分词器
下载最新的lucene和solr。注意solr和lucene版本要一致;并且4.8版本必须使用jdk7以上,否则报错:java.lang.UnsupportedClassVersionError: org/apache/solr/client/solrj/SolrServerException : Unsupported major.minor version 51.0。
新建home与server目录(server存放solr的服务,home是solr的home):
将下载的Solr包解压进入example的solr文件夹中拷贝其中的内容到刚建的home文件夹中。
将example的webapps文件夹中的solr.war包拷贝到刚建的server文件夹中并解压得到。
我们需要在home文件夹中创建一个文件夹命名为data用于存放索引。
修改E:\solr\home\collection1\conf
目录下的solrconfig.xml
文件(102行):
<dataDir>${solr.data.dir:E:\solr\home\data}</dataDir>
修改E:\solr\apache-tomcat-7.0.53\conf下server.xml:
在Host节点中添加:
<Context path="/solr" docBase="E:\solr\server\solr" reloadable="false">
<Environment name="solr/home" type="java.lang.String" value="E:\solr\home" override="true"/>
</Context>
将E:\solr\solr-4.8.1\example\lib\ext
目录下的所有jar包拷贝到E:\solr\server\solr\WEB-INF\lib
目录下。
访问http://localhost:8080/solr 看到了界面说明solr服务安装成功:
整合mmseg4j中文分词器
下载中文分词器
将mmseg4j-1.9.1\dist 目录中的三个jar包拷贝到E:\solr\server\solr\WEB-INF\lib目录中
打开MMSeg4j解压目录中的README.txt文件:
添加README.txt中如上图画方框中的xml内容到Solr\home\collection1\conf\schema.xml
文件的types节点中,并修改最后一项的dicPath为dic:
在Solr/home文件夹中创建dic文件夹,也就是dicPath配置的dic参数
为什么要在home目录中创建dic文件夹那,通过MMSeg4j的README.txt文件可以知道:
dicPath 指定词库位置(每个MMSegTokenizerFactory可以指定不同的目录,当是相对目录时,是相对 solr.home 的目录)
拷贝词库到dic目录中,如果你下载的MMSeg4j文件没有data文件夹,可以下载其他的MMSeg4j文件看看,我下载的mmseg4j-1.9.1就没有data文件夹,但是1.8.5版本是包含data文件夹的,把data文件夹中的文件拷贝到dic文件夹中,好了中文分词器就配好了。启动Solr服务器。
访问启动的Solr的:
这三个就是mmseg4j的分词:
使用mmseg4j的mmseg4j-analysis-1.9.1.jar会出现如下错误:
这是由于源码的一个BUG引起的,需要修改上面下载的mmseg4j-analysis-1.9.1.jar
。
找到E:\lucene教程\mmseg4j-1.9.1\mmseg4j-analysis\src\main\java\com\chenlb\mmseg4j\analysis\MMSegTokenizer.java
修
改文件:
然后使用maven重新编译打包:
cd E:\lucene教程\mmseg4j-1.9.1\mmseg4j-analysis
mvn clean package -DskipTests
在E:\lucene教程\mmseg4j-1.9.1\mmseg4j-analysis\target
目录下生成新的jar包mmseg4j-analysis-1.9.2-SNAPSHOT.jar
,将其替换E:\solr\server\solr\WEB-INF\lib
目录下原有的mmseg4j-analysis-1.9.1.jar
即可
2、solrJ的使用
1、新建项目,导入jar包。将E:\solr\solr-4.8.1\dist\solrj-lib目录下所有包导入项目中并添加solr-core-4.8.1.jar和solr-solrj-4.8.1.jar,
2、创建SolrServer
/**
* HttpSolrServer、EmbeddedSolrServer是两种建立solr服务的方式;
* HttpSolrServer:需要访问外部solr服务,通过HTTP协议访问服务
* EmbeddedSolrServer:将solr集成到项目中
*/
public static HttpSolrServer server = null;
static{
server = new HttpSolrServer("http://localhost:8080/solr");
}
添加文档
/**
* 添加一个document,这里使用默认的field。默认的Field大多是用标准分词器
* field和fieldType在E:\solr\home\collection1\conf\schema.xml文件中配置
* @throws SolrServerException
* @throws IOException
*/
@Test
public void addDocument() throws SolrServerException, IOException{
SolrInputDocument document = new SolrInputDocument();
//id是唯一主键,如果添加多个id相同的document,之前的document会被更新
document.addField("id", "1");
document.addField("title", "浙江是吴越文化、江南文化的发源地,是中国古代文明的发祥地之一。");
document.addField("content", "浙江是吴越文化、江南文化的发源地,是中国古代文明的发祥地之一。早在5万年前的旧石器时代,就有原始人类“建德人”活动,境内有距今7000年的河姆渡文化、距今6000年的马家浜文化和距今5000年的良渚文化,是典型的山水江南、鱼米之乡,被称为“丝绸之府”、“鱼米之乡”。");
server.add(document);
server.commit();
}
/**
* 添加一个document,这里使用自定义的field。
* field和fieldType在E:\solr\home\collection1\conf\schema.xml文件中配置
* @throws SolrServerException
* @throws IOException
*/
@Test
public void addDocumentByMyField() throws SolrServerException, IOException{
SolrInputDocument document = new SolrInputDocument();
//id是唯一主键,如果添加多个id相同的document,之前的document会被更新
document.addField("id", "1");
document.addField("msg_title", "浙江是吴越文化、江南文化的发源地,是中国古代文明的发祥地之一。");
document.addField("msg_content", "浙江是吴越文化、江南文化的发源地,是中国古代文明的发祥地之一。早在5万年前的旧石器时代,就有原始人类“建德人”活动,境内有距今7000年的河姆渡文化、距今6000年的马家浜文化和距今5000年的良渚文化,是典型的山水江南、鱼米之乡,被称为“丝绸之府”、“鱼米之乡”。");
server.add(document);
server.commit();
}
附自定义Field:
3、solr添加文档
3.1、直接添加文档
/**
* 基于列表添加document
* @throws SolrServerException
* @throws IOException
*/
@Test
public void addDocumentByList() throws SolrServerException, IOException{
List<SolrInputDocument> documents = new ArrayList<SolrInputDocument>();
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "1");
document.addField("msg_title", "浙江是吴越文化、江南文化的发源地,是中国古代文明的发祥地之一。");
document.addField("msg_content", "浙江是吴越文化、江南文化的发源地,是中国古代文明的发祥地之一。早在5万年前的旧石器时代,就有原始人类“建德人”活动,境内有距今7000年的河姆渡文化、距今6000年的马家浜文化和距今5000年的良渚文化,是典型的山水江南、鱼米之乡,被称为“丝绸之府”、“鱼米之乡”。");
documents.add(document);
SolrInputDocument document1 = new SolrInputDocument();
document1.addField("id", "2");
document1.addField("msg_title", "江苏,简称“苏”,省会南京。");
document1.addField("msg_content", "江苏省际陆地边界线3383公里,面积10.26万平方公里,占全国的1.06%,人均国土面积在全国各省区中最少。");
documents.add(document1);
server.add(documents);
server.commit();
}
3.2、基于java bean完成文档添加
/**
* 基于java bean添加document
* @throws SolrServerException
* @throws IOException
*/
@Test
public void addDocumentByBean() throws SolrServerException, IOException{
List<Message> list = new ArrayList<Message>();
list.add(new Message("3","3","3"));
list.add(new Message("4","4","4"));
server.addBeans(list);
server.addBean(new Message("5", "5", "5"));
server.commit();
}
Message.java:
package com.lbl.pojo;
import org.apache.solr.client.solrj.beans.Field;
public class Message {
//要添加annotation。可以放到属性上,也可以放到set方法上
@Field
private String id;
@Field
private String msg_title;
@Field
private String msg_content;
public Message() {
super();
// TODO Auto-generated constructor stub
}
public Message(String id, String msg_title, String msg_content) {
super();
this.id = id;
this.msg_title = msg_title;
this.msg_content = msg_content;
}
public String getId() {
return id;
}
public String getMsg_title() {
return msg_title;
}
public String getMsg_content() {
return msg_content;
}
public void setId(String id) {
this.id = id;
}
public void setMsg_title(String msg_title) {
this.msg_title = msg_title;
}
public void setMsg_content(String msg_content) {
this.msg_content = msg_content;
}
}
4、solr的查询
在中设置默认搜索域
<!--默认搜索域
<defaultSearchField>text</defaultSearchField>-->
如果一次查询多个域,用“或”链接,可以在设置:
<!--设置multiValued可以查询多个域,但要设置copyField ->
<field name="msg_all" type="textComplex" indexed="true" stored="true" multiValued="true" />
<copyField source="msg_title" dest="msg_all"/>
<copyField source="msg_content" dest="msg_all"/>
基于结果集的查询
基于bean的查询
5、高亮查询
@Test
public void query01() throws SolrServerException, IOException{
SolrQuery query = new SolrQuery("msg_title:中国");
QueryResponse queryResponse = server.query(query);
SolrDocumentList results = queryResponse.getResults();
System.out.println(results.size());
for (SolrDocument solrDocument : results) {
System.out.println("id:" + solrDocument.get("id") + "\nmsg_title:" + solrDocument.get("msg_title") + "\nmsg_content:" + solrDocument.get("msg_content"));
}
}
@Test
public void query02() throws SolrServerException, IOException{
SolrQuery query = new SolrQuery("msg_title:中国");
// SolrQuery query = new SolrQuery("*");//查询所有
query.setHighlight(true)//设置高亮
.setHighlightSimplePre("<span color='red'>")
.setHighlightSimplePost("<span/>")
.setParam("hl.fl", "msg_title")
//分页(默认不是按照id排序)
.setStart(0)//从第几个开始
.setRows(3);//查询及条记录
QueryResponse queryResponse = server.query(query);
SolrDocumentList results = queryResponse.getResults();
System.out.println(results.size());
for (SolrDocument solrDocument : results) {
System.out.println("id:" + solrDocument.get("id") + "\nmsg_title:" + solrDocument.get("msg_title") + "\nmsg_content:" + solrDocument.get("msg_content"));
//要显示高亮内容需要使用如下语法(注意:这里必须存储,否则根本查询不出来数据):
String id = solrDocument.get("id").toString();
//根据id将设为高亮的字段查询出来
System.out.println(queryResponse.getHighlighting().get(id));
}
}