solr進階一:java代碼添加索引和增加IKAnalyzer分詞支持

觀察solr的工作環境solr_tomcat\solr\collection1\,在這裏面存在兩個文件夾:confdata。其中conf裏存放了對solr而言最爲重要的兩個配置文件schema.xmlsolrconfig.xml,前者是索引字段等的設置,後者是性能的設置。data文件夾則用於存放索引文件。

schema.xml主要包括typesfields和其他的一些缺省設置。

solrconfig.xml用來配置Solr的一些系統屬性,例如與索引和查詢處理有關的一些常見的配置選項,以及緩存、擴展等等。

上面的文檔對這兩個文件有比較詳細的說明,非常容易上手。注意到schema.xml裏有一個

<uniqueKey>id</uniqueKey>的配置,這裏將id字段作爲索引文檔的唯一標識符,非常重要。

Solr提供了一個企業搜索引擎平臺的核心,可以通過他的接口進行索引的創建、修改、刪除。並提交關鍵字進行搜索。但如果要真正的投入使用,還是有不少工作需要做,如:

 

1、對向Solr提交索引進行一定的封裝以方便業務系統進行操作

2、對搜索進行封裝,以方便結果的展現分析等等。

 

Solrj是使用java編寫的一個操作Solr的工具,方便於進行索引的更新、搜索結果的獲取等等。

Solr的發佈包裏面有Solrj的相關jar包。Solrj需要的jar包爲:

 

solr-4.10.2\dist目錄下的solr-solrj-4.10.2.jar和它的依賴包solr-4.10.2\dist\solrj-lib,另外還需要commons-logging這個jar,否則運行會提示缺少這個jar包。

如果是使用maven,可以添加:

<dependency>
 <groupId>org.apache.solr</groupId>
 <artifactId>solr-solrj</artifactId>
 <version>4.10.2</version>
</dependency>

目錄結構可以是這樣:




使用Solrj更新索引

 

使用Solrj是首先我們實例化一個SolrServer,這裏使用HttpSolrServer。我們再創建一個SolrInputDocument以方便來添加要索引的數據。這裏的Field是在\solr\solr\collection1\conf\schema.xml裏面定義的,如果沒有在這裏面定義的話就可以使用動態添加字段,以下的示例代碼就是動態添加字段:

import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Lhx on 14-12-3.
 */
public class AddField {
    public static void main(String[] args) {
        String url = "http://localhost:8080/solr";
        SolrServer server = new HttpSolrServer(url);
        SolrInputDocument doc1 = new SolrInputDocument();

        doc1.addField("id","1");
        doc1.addField("title","廣東某某科技");
        doc1.addField("cat","互聯網科技公司,擁有大量高素質人才");

        SolrInputDocument doc2 = new SolrInputDocument();
        doc2.addField("id","2");
        doc2.addField("title","廣西某X工業園");
        doc2.addField("cat","工業園生成產品的喔!");

        SolrInputDocument doc3 = new SolrInputDocument();
        doc3.addField("id","3");
        doc3.addField("title","lifeix");
        doc3.addField("cat","天氣變冷了,要記得穿衣服");

        List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
        docs.add(doc1);
        docs.add(doc2);
        docs.add(doc3);
        try {
            server.add(docs);
            server.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

這裏的ID值是string類型的,因爲在solr_tomcat\solr\collection1\conf裏面的schema.xml定義了:


運行後,添加了三個documentsolr的索引庫裏面,到solr主界面裏面能看到:



數據存放在哪裏都有提示了。

version : 每更新一個字段就加1

其餘的看英文註釋就可以大概知道什麼意思了。

 

接着就是進行搜索了。

繼續使用solrj搜索

搜索的第一步和上面一樣,先取得一個SolrServer。然後創建一個SolrQuery進行搜索,搜索取得的數據已經封裝在QueryResponse裏面,通過相關API獲取結果數據。示例代碼如下:

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;

/**
 * Created by Lhx on 14-12-3.
 */
public class SolrjQuery {
    public static void main(String[] args) {
        String url = "http://localhost:8080/solr";
        SolrServer server = new HttpSolrServer(url);
        SolrQuery query = new SolrQuery("廣東");
        try {
            QueryResponse response = server.query(query);
            SolrDocumentList docs = response.getResults();
            System.out.println("文檔個數:" + docs.getNumFound());
            System.out.println("查詢時間:" + response.getQTime());
            for (SolrDocument doc : docs) {
                System.out.println("id" + doc.getFieldValue("id"));
                System.out.println("name" + doc.getFieldValue("title"));
                System.out.println("==================");
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        }
    }
}

結果把“廣西”也搜索出來了,可見結果不是很準確。




我們也可以在solr頁面上進行搜索。

打開頁面,選擇“collection1


接着:


選擇左邊的“Query”,在“q”裏面輸入:titile:廣西,點擊“Execute Query”按鈕就可以進行搜索了,結構顯示在右邊。綠色框是get請求的地址,在任意瀏覽器裏面輸入這一地址就可以返回json數據了。

到這裏你想到了什麼沒?用solr做搜索簡直太簡單了!把需要的詞彙存入,然後對接客戶端的接口,一個搜索引擎就建成了,當然這其中還有很多優化工作做,不過至少我們有一個山寨搜索引擎了!


===============================================================================================================


爲使搜索更準確些,我們現在加入中文分詞器,要加入的中文分詞器爲ik-analyzer。

到網上隨便搜一個,我下載的是2012版的。

壓縮包裏面的內容如下:


IK-Analyzer下載地址:

http://pan.baidu.com/s/1o6FRx0Y


IKAnalyzer2012.jar拷貝到tomcat目錄下的solr項目中:

apache-tomcat-6.0.43\webapps\solr\WEB-INF\lib

IKAnalyzer.cfg.xmlstopword.dic拷貝到需要使用分詞器的corecollection)的conf下面,和coreschema.xml文件一個目錄:

solr_tomcat\solr\collection1\conf

修改coreschema.xml,在下面加一段如下配置:

<fieldType name="text_ik" class="solr.TextField">   
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
 </fieldType>

<field name="name1" type="text_ik" indexed="true" stored="true" multiValued="false" />

如下圖:



網上的教程都寫成了:

<field name="name" type="text_ik" indexed="true" stored="true" multiValued="false" />

當你啓動tomcat的後,會報出以下錯誤:


根據英文提示,知道我們的name是重複定義的了,拉到配置文件的前面,能發現也有<field name="name" ……………………>所以這個name的值要改變一下,不能和前面定義的重複就可以了。

重啓tomcat,刷新一下solr頁面,在左側點擊下拉列表,點擊“collection1”,就會展示這個core的功能列表出來,選擇“Analysis”,接着在右邊中間的下拉選擇“name1”,也就是我們定義的字段。


——————————————————————


——————————————————————————————————


——————————————————————————————

輸入一條中文語句就能分析了:

Tomcat裏面的提示:


現在我們回到前面的問題,當輸入“廣東”的時候,連“廣西”的信息也查詢出來了,到schema.xml文件裏面,發現“title”這個字段默認的類型是:text_general

整條語句是這樣的:

<field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/>

在界面的Analysis分析句子功能中,輸入“廣東”兩個字,會發現這個詞被分開了,其實輸入什麼漢字,都是會分成一個個漢字的。此時,我們就要用到剛剛配置好的分詞工具了。把配置語句改爲:

<field name="title" type="text_ik" indexed="true" stored="true" multiValued="true"/>

重啓Tomcat,在Analysis分析裏面,會發現“廣東”這個詞不會分開了,“廣西”這個詞也不會分開了。這樣就爲我們的精確搜索打下了基礎。


來到“Query”界面,輸入:title:廣東,發現居然沒有搜索到信息!仔細一看:



原來title是數組數據了,回到schema.xml文件,還是修改那段話,修改爲:

<field name="title" type="text_ik" indexed="true" stored="true" multiValued="false"/>

multiValuedfalse,重啓Tomcat,重新導入數據,發現數據是單值的了:


搜索,做到了精確搜索:


在原來的代碼裏面,改這行代碼:

SolrQuery query = new SolrQuery("title:廣東");

運行:


沒有“廣西”的結果出來了!

===============================

後記:

 

跟着我做,你會在刷新solr頁面那裏發現這樣的提示:









core完全不能用,tomcat裏面的提示也只是找不到某某類而已。我也找了很多資料,可是都不能解釋爲什麼這樣!最後我還是按大多數教程換成了IK Analyzer 2012FF_hf1,把裏面的那三個文件一次替代了。就不會出現這樣的問題了!

 

鄭重提示:一定要使用: IK Analyzer 2012FF_hf1



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章