Solr

Solr是什么?

Solr 是Apache下的一個頂級開源項目,采用Java開發,它是基于Lucene的全文搜索服務器。Solr提供了比Lucene更為豐富的查詢語言,同時實現了可配置、可擴展,并對索引、搜索性能進行了優化。
Solr是一個全文檢索服務器,只需要進行配置就可以實現全文檢索服務。

Solr的安裝及配置

Solr的版本:4.10.3

安裝步驟

需要把solr服務器安裝到linux環境:
第一步:安裝linux、jdk、tomcat。
[root@bogon ~]# ll
total 8044
-rw-r--r--. 1 root root 8234674 Oct 27 2013 apache-tomcat-7.0.47.tar.gz
[root@bogon ~]# tar -zxf apache-tomcat-7.0.47.tar.gz
[root@bogon ~]# ll
total 8048
drwxr-xr-x. 9 root root 4096 Sep 10 17:55 apache-tomcat-7.0.47
-rw-r--r--. 1 root root 8234674 Oct 27 2013 apache-tomcat-7.0.47.tar.gz
[root@bogon ~]# mkdir /usr/local/solr
[root@bogon ~]# cp apache-tomcat-7.0.47 /usr/local/solr/tomcat
cp: omitting directory `apache-tomcat-7.0.47'
[root@bogon ~]# cp apache-tomcat-7.0.47 /usr/local/solr/tomcat -r
[root@bogon ~]# cd /usr/local/solr/
[root@bogon solr]# ll
total 4
drwxr-xr-x. 9 root root 4096 Sep 10 17:56 tomcat
[root@bogon solr]#
第二步:把solr的壓縮包上傳到服務器。并解壓。
第三步:把/root/solr-4.10.3/dist/solr-4.10.3.war包部署到tomcat下。并改名為solr.war
[root@bogon dist]# cp solr-4.10.3.war /usr/local/solr/tomcat/webapps/solr.war
第四步:解壓war包。啟動tomcat自動解壓。關閉tomcat。刪除solr.war.
第五步:把/root/solr-4.10.3/example/lib/ext 目錄下所有的jar包復制到solr工程中。
[root@bogon ext]# cp * /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
第六步:創建solrhome。Solrhome是存放solr服務器所有配置文件的目錄。
[root@bogon example]# pwd
/root/solr-4.10.3/example
[root@bogon example]# cp -r solr /usr/local/solr/solrhome
[root@bogon example]#
第七步:告訴solr服務器solrhome的位置。
需要修改solr工程的web.xml文件。

第八步:啟動tomcat

配置業務字段

1、在solr中默認是中文分析器,需要手工配置。配置一個FieldType,在FieldType中指定中文分析器。
2、Solr中的字段必須是先定義后使用。

中文分析器的配置

第一步:使用IK-Analyzer。把分析器的文件夾上傳到服務器。

第二步:需要把分析器的jar包添加到solr工程中。

[root@bogon IK Analyzer 2012FF_hf1]# cp IKAnalyzer2012FF_u1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
[root@bogon IK Analyzer 2012FF_hf1]#
第三步:需要把IKAnalyzer需要的擴展詞典及停用詞詞典、配置文件復制到solr工程的classpath。
/usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

[root@bogon IK Analyzer 2012FF_hf1]# cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes
[root@bogon IK Analyzer 2012FF_hf1]#

注意:擴展詞典及停用詞詞典的字符集必須是utf-8。不能使用windows記事本編輯。

第四步:配置fieldType。需要在solrhome/collection1/conf/schema.xml中配置。
技巧:使用vi、vim跳轉到文檔開頭gg。跳轉到文檔末尾:G

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

業務字段配置

業務字段判斷標準:
在搜索時是否需要在此字段上進行搜索。例如:商品名稱、商品的賣點、商品的描述
后續的業務是否需要用到此字段。例如:商品id。

需要用到的字段:
商品id
商品title
賣點
價格
商品圖片
商品分類名稱
商品描述

Solr中的業務字段:
id——>商品id
其他的對應字段創建solr的字段。

<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price"  type="long" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category_name" type="string" indexed="true" stored="true" />
<field name="item_desc" type="text_ik" indexed="true" stored="false" />

<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
<copyField source="item_category_name" dest="item_keywords"/>
<copyField source="item_desc" dest="item_keywords"/>

重新啟動tomcat

維護索引庫

添加:添加一個json格式的文件就可以。
修改:在solr中沒有update,只需要添加一個新的文檔,要求文檔id和被修改文檔的id一致。原理是先刪除后添加。
刪除:使用xml格式。

刪除兩種方法:
1、根據id刪除:
<delete>
<id>test001</id>
</delete>
<commit/>
2、根據查詢刪除:
<delete>
<query>:</query>
</delete>
<commit/>

solrJ客戶端

需要依賴solrj的jar包

<!-- solr客戶端 -->
        <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
        </dependency>

solrj的使用

public class SolrJTest {

    @Test
    public void addDocument() throws Exception {
        //創建一連接
        SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        //創建一個文檔對象
        SolrInputDocument document = new SolrInputDocument();
        document.addField("id", "test001");
        document.addField("item_title", "測試商品2");
        document.addField("item_price", 54321);
        //把文檔對象寫入索引庫
        solrServer.add(document);
        //提交
        solrServer.commit();
    }
    
    @Test
    public void deleteDocument() throws Exception {
        //創建一連接
        SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        //solrServer.deleteById("test001");
        solrServer.deleteByQuery("*:*");
        solrServer.commit();
    }
}


Solr集群

什么是SolrCloud?

SolrCloud(solr 云)是Solr提供的分布式搜索方案,當你需要大規模,容錯,分布式索引和檢索能力時使用 SolrCloud。當一個系統的索引數據量少的時候是不需要使用SolrCloud的,當索引量很大,搜索請求并發很高,這時需要使用SolrCloud來滿足這些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作為集群的配置信息中心。
它有幾個特色功能:
1)集中式的配置信息
2)自動容錯
3)近實時搜索
4)查詢時自動負載均衡

Solr集群的結構

Solr集群的搭建

本教程的這套安裝是單機版的安裝,所以采用偽集群的方式進行安裝,如果是真正的生產環境,將偽集群的ip改下就可以了,步驟是一樣的。
SolrCloud結構圖如下:


需要三個zookeeper節點
四個solr節點。

使用偽分布式實現solr集群。需要三個zookeeper實例,4個tomcat實例,可以在一臺虛擬機上模擬。建議虛擬機1G以上內存。

Solr實例的搭建

第一步:創建4個tomcat實例,修改其端口。8080-8083
第二步:解壓solr-4.10.3.tar.gz壓縮包。從壓縮包中復制solr.war到tomcat。
第三步:啟動tomcat解壓war包。把solr-4.10.3目錄下example目錄下的關于日志相關的jar包添加到solr工程中。
第四步:創建solrhome。修改web.xml指定solrhome的位置。(每個solr下都要有獨立的solrhome)

solr集群的搭建

把solrhome中的配置文件上傳到zookeeper集群。使用zookeeper的客戶端上傳。
客戶端命令位置:/root/solr-4.10.3/example/scripts/cloud-scripts

./zkcli.sh -zkhost 192.168.1.104:2181, 192.168.1.104:2182, 192.168.1.104:2183 -cmd upconfig -confdir /usr/local/solrcloud/solrhome1/collection1/conf -confname myconf

查看配置文件是否上傳成功:
[root@bogon bin]# ./zkCli.sh
Connecting to localhost:2181
[zk: localhost:2181(CONNECTED) 0] ls /
[configs, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /configs
[myconf]
[zk: localhost:2181(CONNECTED) 2] ls /configs/myconf
[admin-extra.menu-top.html, currency.xml, protwords.txt, mapping-FoldToASCII.txt, _schema_analysis_synonyms_english.json, _rest_managed.json, solrconfig.xml, _schema_analysis_stopwords_english.json, stopwords.txt, lang, spellings.txt, mapping-ISOLatin1Accent.txt, admin-extra.html, xslt, synonyms.txt, scripts.conf, update-script.js, velocity, elevate.xml, admin-extra.menu-bottom.html, clustering, schema.xml]
[zk: localhost:2181(CONNECTED) 3]

第二步 修改solrhome下的solr.xml文件,指定當前實例運行的ip地址及端口號

第三步 修改每一臺solr的tomcat 的 bin目錄下catalina.sh文件中加入DzkHost指定zookeeper服務器地址:

JAVA_OPTS="-DzkHost=192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"

第四步 重新啟動tomcat。

一個主節點多個備份節點,集群只有一片。

第五步 創建一個兩片的collection,每片是一主一備
使用以下命令創建:

http://192.168.25.154:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
![](http://upload-images.jianshu.io/upload_images/2352668-10ed4a109f47922d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

第六步 刪除collection1.

http://192.168.25.154:8080/solr/admin/collections?action=DELETE&name=collection1

Solr集群的使用
使用solrj操作集群環境的索引庫

Solrj測試

public class SolrCloudTest {

    @Test
    public void testAddDocument() throws Exception {
        //創建一個和solr集群的連接
        //參數就是zookeeper的地址列表,使用逗號分隔
        String zkHost = "192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183";
        CloudSolrServer solrServer = new CloudSolrServer(zkHost);
        //設置默認的collection
        solrServer.setDefaultCollection("collection2");
        //創建一個文檔對象
        SolrInputDocument document = new SolrInputDocument();
        //向文檔中添加域
        document.addField("id", "test001");
        document.addField("item_title", "測試商品");
        //把文檔添加到索引庫
        solrServer.add(document);
        //提交
        solrServer.commit();
    }
    
    @Test
    public void deleteDocument() throws SolrServerException, IOException {
        //創建一個和solr集群的連接
        //參數就是zookeeper的地址列表,使用逗號分隔
        String zkHost = "192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183";
        CloudSolrServer solrServer = new CloudSolrServer(zkHost);
        //設置默認的collection
        solrServer.setDefaultCollection("collection2");
        
        
        solrServer.deleteByQuery("*:*");
        solrServer.commit();
    }
}

Solrj和spring集成

<!-- 集群版 -->
    <bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
        <constructor-arg name="zkHost" value="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"></constructor-arg>
        <property name="defaultCollection" value="collection2"></property>
    </bean>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容