整合 PHP 應用和 Solr 搜尋引擎

來源:互聯網
上載者:User
你為什麼需要搜尋引擎?單純資料庫不夠用?如果你只是建立小網站,資料庫就夠了。但當你建立中性或大型應用的時候,搜尋引擎是更明智的選擇。當然如是一說,小網站也可以利用Solr,獲得高相關性的搜尋結果。

想象一下你在寫一個電子商務網站的搜尋查詢程式。最直接的想法就是如下的資料庫查詢語句:

SELECT * FROM PRODUCTSWHERE LOWER(title) like LOWER('%$phrase%')OR LOWER(description) like LOWER('%$phrase%');

查詢標題或描述中的短語時,它工作正常。但是現實事物很複雜,比如說Apple iPhone 4G black 16GB(蘋果4G網路iPhone黑色16GB)。搜尋“iPhone 16G”的時候,就沒結果。你可以用%替換空格應付這種情況。

$phrase = str_replace(' ', '%', $phrase);

那麼查詢“iPhone 16GB 4G”的時候呢?顯然詞序改變了,它又無法正常工作。我猜你又會添加一個欄位儲存詞序。那麼寫錯詞怎麼辦?同義字怎麼辦?為如此的搜尋系統想一個好的解決方案很有挑戰性。


設計一個精妙的演算法不是解決這類問題的關鍵. 文本的搜素是需要消耗資源的. 將太多的壓力放在資料庫端永遠不是一個好辦法. 原因是資料庫不能很方便的擴充. 你不能像web server 或者 Memcached一樣,簡單的增加一個執行個體.擴充資料庫需要一些準備, 代碼的修改, 配置, down機維護時間, 總之成本是非常昂貴的. 好訊息是Solr就是專門解決這類問題的.

Solr是一個基於Apache Lucene的企業級搜尋平台. 快,穩定, 有很好的文檔當然擴充起來也很方便. 由於Solr是有個強大的解決方案, 他的所有特性就不在這篇文章裡面一一列舉了. 這傢伙上收合來也是相當easy哦.

首先從官方網站下載最新的版本。Solr是一個由Java語言編寫的應用程式,你需要Java Runtime環境才可以運行。

$ cd solr-4.1.0/example/$ java -jar start.jar

大概幾秒鐘後你就可以看到下面的資訊:

2013-03-09 18:47:41.177:INFO:oejs.AbstractConnector:Started SocketConnector@0.0.0.0:8983

Solr有一個web介面,工作在8983連接埠下,開啟瀏覽器訪問http://localhost:8983/solr/.

在左手邊的導航區你會找到“collection1″。在Solr中,Collections類似於資料庫的表,你可以查詢資料。點擊一個collection,選擇她的子功能表 “query”。

第一個選項叫 “Request-Handler (qt)”,擁有預設值 “/select”。Request handlers是一組預定義查詢. 如果你查看Solr config檔案,你就會看到是這樣的:

$ vim solr-4.1.0/example/solr/collection1/conf/solrconfig.xml
<requestHandler name="/select" class="solr.SearchHandler">    <lst name="defaults">        <str name="echoParams">explicit</str>       <int name="rows">10</int>       <str name="df">text</str>    </lst></requestHandler>

第二個參數才是我們最感興趣的。預設值 “*:*” 意味著查詢任何內容,如果你點擊“execute query” ,你可以得到像下面這樣的內容:

<?xml version="1.0" encoding="UTF-8"?><response>    <lst name="responseHeader">        <int name="status">0</int>        <int name="QTime">1</int>        <lst name="params">        <str name="indent">true</str>        <str name="q">*:*</str>        <str name="wt">xml</str>        </lst>    </lst>    <result name="response" numFound="0" start="0" /></response>

索引結果為空白,但這不是什麼問題,你需要插入一些樣本資料。

$ cd solr-4.1.0/example/exampledocs/$ java -jar post.jar monitor.xml SimplePostTool version 1.5Posting files to base url http://localhost:8983/solr/update using content-type application/xml..POSTing file monitor.xml1 files indexed.COMMITting Solr index changes to http://localhost:8983/solr/update..

現在你可以返回查詢介面,這次就會有一個文檔返回。

Collection的資料結構是在schema檔案中定義的。

$ vim solr-4.1.0/example/solr/collection1/conf/schema.xml

這個檔案有非常多的注釋,你可以很容易分辨出他們是做什麼的。如果你要修改scheme檔案,請不要刪除名叫“text”的欄位(如果沒很好的理由),他是和另外的欄位和查詢語句中關聯的(包括select, look等等)。

$ grep text solr-4.1.0/example/solr/collection1/conf/schema.xml | grep copy <copyField source="cat" dest="text"/><copyField source="name" dest="text"/><copyField source="manu" dest="text"/><copyField source="features" dest="text"/><copyField source="includes" dest="text"/><copyField source="title" dest="text"/><copyField source="author" dest="text"/><copyField source="description" dest="text"/><copyField source="keywords" dest="text"/><copyField source="content" dest="text"/><copyField source="content_type" dest="text"/><copyField source="resourcename" dest="text"/><copyField source="url" dest="text"/>

如果你使用的是關聯式資料庫,你不希望有重複的資料。Solr不是一個資料庫,多數欄位也被處理成文字欄位,預設request handler就是這樣。

從PHP訪問Solr需要一個用戶端。我建議從PECL下載一個。它快速,API清晰,文檔優良。不過要注意,這個擴充現在版本1.0.2,不支援Solr 4.x。Solr 3.x和4.x的協議有微小不同。不過別擔心,我已經做了修改,你可以從https://github.com/lukaszkujawa/php-pecl-solr下載相容版本。我已經用了一段時間,是可靠的。它和官方的有點差別在SolrClient建構函式中多一個Solr版本參數。這個補丁將會發布在官方版本中,你不用擔心此後的相容性。

$ git clone https://github.com/lukaszkujawa/php-pecl-solr.git$ cd php-pecl-solr/$ phpize$ whereis php-configphp-config: /usr/bin/php-config /usr/bin/X11/php-config$ ./configure --with-php-config=/usr/bin/php-config$ make$ make install

添加到你的php.ini

extension=solr.so

重啟Web伺服器

$ /etc/init.d/apache2 restart

現在就可以寫php新增內容到索引中了。

<?php $options = array (    'hostname' => '127.0.0.1',); $client = new SolrClient($options, "4.0"); // 參數4.0針對Solr4.x,其他版本時忽略 $doc = new SolrInputDocument(); $doc->addField('id', 100);$doc->addField('title', 'Hello Wolrd');$doc->addField('description', 'Example Document');$doc->addField('cat', 'Foo');$doc->addField('cat', 'Bar'); $response = $client->addDocument($doc); $client->commit(); /* ------------------------------- */ $query = new SolrQuery(); $query->setQuery('hello'); $query->addField('id')->addField('title')->addField('description')->addField('cat'); $queryResponse = $client->query($query); $response = $queryResponse->getResponse(); print_r( $response->response->docs );

如果你添加的文檔不止一條,她也可以處理得很好,而不需要頻繁的commit。

知道Solr如何工作是很有價值的,你可以在很多項目中使用。她有個很棒的功能可以讓你一次請求就可以拉取所有需要的資料。當然,你掌握她需要耗費一些時間,但這值得你付出。Solr擁有一個活躍的社區和完整的文檔資源,如果你還擔心在項目中使用,請翻閱Solr 3 企業搜尋伺服器,她不僅僅是讓你快速搭建起搜尋服務,還是你資料採礦的基礎。

相關文章:

php的solr的操作類及demo

安裝php-solr擴充

搜尋方案 solr+php如何安裝配置?

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.