solr4.8.1學習筆記
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
整合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));
}
}