php使用solr全文搜索引擎


前言

  本來以為網上已經有了類似博文,不想重復,可是一圈搜下來,都是一些內容不甚明了的文章,或者solr版本太過老,參考價值不高,更有甚者,直接拷貝的別人的內容。一篇博客,各大平台都能看到,也不見轉載鏈接。有人說百度搜索不到內容,用谷歌,把責任推到百度身上,但這是百度的原因嗎?在國內網絡的資源整體質量不高低,並且內容太多重復的情況下,百度能夠提供什么高質量的內容給你。

也有我搜索資源的時候,會看到IBM開者中心的翻譯文檔,在文章的最后,都會附上參考文章,但是在國內,顯有這種情況。那些拷貝別人博文的人,有沒有想過,寫一篇博文的不易?同樣,博文作者是否也想過這個問題?話不多說,進入正題。

聲明:因為本人不是從事java開發,而且技術不高,英語也很差,如果文章中存在錯誤的解說,望諒。

參考文章:

solr官方文檔

solr擴展php官方手冊

使用 PHP 和 Apache Solr 實現企業搜索

window環境

1,安裝solr

下載solr,選擇相應版本,注意:因為solr對是基於java的,所以必需安裝jre。每個版本的 solr對jre版本要求不一樣,下載時請注意solr的版本。

編寫這篇博文時,solr的最新版本是6.6,文章也是基於6.6版本寫的,其要求1.8版本或以上的jre。jre的安裝,這些就不列出了,因為太過簡單。

Window用戶請下載zip包

將壓縮包解壓到相應目錄

使用命令行工具,進入解壓后的solr目錄的bin目錄

啟動solr

運行命令: bin\solr.cmd start

 

 

注意:solr有兩種模式:core,collection,如果要使用collection,請加-c或者-cloud,啟用solrClund。兩者之間的區別,我不敢妄下定論。從搜索的資料綜合分析,一個是單機,一個是集群,此處僅供參考,可能存在錯誤。

solr默認監聽的是8983端口

更多命令用法,請使用solr -help,如果solr已經啟動,請使用solr start -help。

如果啟動成功,可以在瀏覽器中打開:http://localhost:8983/solr/,使用其web管理客戶端。

2,查看solr范例

先停止solr實例

bin\solr.cmd stop

再啟用solr范例

bin\solr.cmd -e techproducts

打開web管理客戶端:http://localhost:8983/solr/,查看結果

根據結果,可知道,techproducts范例中共有32篇文章。

現在可以嘗試他的查詢功能。

我在q輸入框中輸入了Samsung,其得到的結果如下圖

3,添加文檔

添加好后,進入查詢界面,看能否查到這篇文檔

4,刪除文檔

返回查詢界面,查詢刪除后的結果

solr是通過Request-Handler指令操作文檔的,solr項目所有的Request-Handler指令都定義在項目目錄的conf文件夾下的solrconfig.xml文件里requestHandler標簽中。

關於文檔操作更詳細的說明請參考:

Indexing and Basic Data Operations 

Uploading Data with Index Handlers  

 

5,創建solr項目

現在學會一些基本的操作,可以自己創建一個項目錄了。

先把停止solr

solr.cmd stop -all

solr是一個實例可以有多個core或collection,如果不先停止,創建的core將會添加到啟用的techproducts實例中

solr.cmd create -c test

 

重新刷新web客戶端

6,下載php的solr擴展

現在開始使用php和solr交互了,所以必需安裝solr擴展,下載地址

下載解壓之后,將其中的dll文件放到php的擴展目錄,對於php擴展所在目錄,然后在php.ini開啟solr擴展,再通phpinfo查看是否正常安裝。

我默認所有讀者都知道php擴展配置方式,所有這里不詳細描述。

注意:php有Thread Safe和NoneThread Safe之分,下載之前,請先確定你安裝的php是哪種類型。

7,使用php腳本添加文檔

$options = array
(
    'hostname' => "localhost",
    'path'     => 'solr/test',
    'port'     => '8983',
);

$client = new SolrClient($options);
$data = array(
    array(
    'id' => 'EN80922032',
    'name' => '男士打磨直筒休閑牛仔褲',
    'brand' => 'ENERGIE',
    'cat' => '牛仔褲',
    'price' => '1870.00'
    ),
    array(
    'id' => 'EN70906025',
    'name' => '品牌LOGO翻領拉鏈外套',
    'brand' => 'ENERGIE',
    'cat' => '外套',
    'price' => '1680.00'
    ),
);


foreach($data as $key => $value) {
    $doc = new SolrInputDocument();
    foreach($value as $key2 =>$value2) {
      $doc->addField($key2,$value2);
    }
   $client->addDocument($doc); 

}
$client->commit();

在solr的web客戶端查詢的結果

更多實例請見:php的solr擴展官方文檔

注意:參考官方文檔時,注意其連接參數,依其博文必需有path參數,path參數是"solr/",加上你用solr創建的core名稱。

9,使用php腳本查詢文檔

$options = array
(
    'hostname' => "localhost",
    'path'     => 'solr/test',
    'port'     => '8983',
);

$client = new SolrClient($options);
$query = new SolrQuery();

$query->setQuery('打磨');

$query->setStart(0);

$query->setRows(50);

$query->addField('name');

$query_response = $client->query($query);

$response = $query_response->getResponse();

print_r($response);

輸入的結果

SolrObject Object
(
    [responseHeader] => SolrObject Object
        (
            [status] => 0
            [QTime] => 3
            [params] => SolrObject Object
                (
                    [q] => 打磨
                    [indent] => on
                    [fl] => name
                    [start] => 0
                    [rows] => 50
                    [version] => 2.2
                    [wt] => xml
                )

        )

    [response] => SolrObject Object
        (
            [numFound] => 1
            [start] => 0
            [docs] => Array
                (
                    [0] => SolrObject Object
                        (
                            [name] => Array
                                (
                                    [0] => 男士打磨直筒休閑牛仔褲
                                )

                        )

                )

        )

)

10,使用php腳本刪除文檔

$client->deleteByQuery('id:EN80922032'); 
$result = $client->commit();
print_r($result);

輸出的結果不易看懂

可以使用第九條“使用php腳本查詢文檔”,查看刪除后的結果,也可以用web客戶端查看結果。

11,更新文檔

更新文檔和添加文檔一樣,只要在數據中指定要更新的id即可。

12,添加搜索建議

在添加的core的conf文件里sorlconfig.xml中新增一搜索建議組件。依本博文,目錄地址為:solr-6.6.0\server\solr\test\conf\solrconfig.xml

配置只在solr6.6上經過測試,不能保證可在其他solr版本中使用

  <searchComponent name="suggest" class="solr.SuggestComponent">
    <str name="queryAnalyzerFieldType">string</str>    
    <lst name="suggester">    
        <str name="name">suggest</str>      
    
        <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookupFactory</str>      
        <str name="field">title</str>      
        <str name="buildOnOptimize">true</str>    
        <str name="buildOnCommit">true</str>         
    </lst>      
  </searchComponent>        
     
  <requestHandler name="/suggest" class="solr.SearchHandler" 
                  startup="lazy" >
    <lst name="defaults">      
       <str name="suggest">true</str>   
        <str name="suggest.dictionary">suggest</str>    
        <str name="suggest.count">10</str>        
    </lst>      
    <arr name="components">      
        <str>suggest</str>      
    </arr>      
  </requestHandler>  

23,添加中文分詞

solr自帶了中文分詞功能,依本博文,目錄地址為:solr-6.6.0\contrib\analysis-extras\lucene-libs\lucene-analyzers-smartcn-6.6.0 .jar。

首先查看sorlconfig.xml配置文件是否已經配置了這個分配庫的地址

<lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />

如果沒有,請配置分詞庫的地址。

在managed-schema文件中新增一個字段類型

<fieldType name="text_cn" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
      </analyzer>
      <analyzer type="query">
         <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
       </analyzer>
    </fieldType>

然后將相應字段的類型設置成text_cn,例如,本博文中將name設為text_cn類型

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

 在后台選擇相應的core,點擊【analysis】菜單,在字段值中輸入相應中文,在Fieldname/FieldType中選擇相應設置了字段類型為text_cn的字段,或者直接選擇text_cn字段類型,點擊【analysis】查看分詞效果

為什么要設置中文分詞呢?

在說原因之前,我們先查看使用其他字段類型分析結果。

solr因為不支持中文,將會對內容時行最小分割,一個詞一個索引,如果不使用中文分詞,將產生大量的索引,以滿足中文的搜索需求。(此為個人觀點,未佐證,請務盲目相信)。

另外,如果不使用中文分詞,那搜索建議只能返回單個中文字。新增一條文檔記錄,測試搜索建議的結果是否真是如此。

注意:測試這個功能時,請將含有中文的字段改為未設置中文分詞的字段類型,更改后重啟solr,並重新添加一條文檔,文檔中的中文詞匯必需是 solr現有文檔中不存在的詞匯。

新增文檔

以下是瀏覽器搜索結果

測試成功,我們將此文檔刪除,並重新添加這個文檔,將字段類型更為中文分詞類型,即本博文中新增的 text_cn 。

注意:刪除文檔之后,最好查詢一下,solr中是還存在此文檔,以防重復文檔未被刪除.

再次搜索

結語:水平有限,只能寫這么多。如果有時間,我將持續更新此博文。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM