1. 程式人生 > >solr4.8.1學習筆記

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

看到了介面說明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));
    }

  }

這裡寫圖片描述