天天看點

搜尋方案 solr+php 安裝配置

1.去http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

中下載下傳jdk的安裝檔案。我下載下傳jdk-8u77-linux-x64.gz檔案。

2.mkdir /usr/local/java

3.把 jdk-8u77-linux-x64.gz 放到 /usr/local/java 下

4.cd /usr/local/java

5.執行指令tar -zxvf jdk-8u77-linux-x64.gz 進行解壓,解壓後發現/usr/local/java多了一個jdk1.8.0_77檔案夾。

通過以上步驟,jdk就已經全部安裝完成了。

下面,就是環境變量的配置。

1.使用vim /etc/profile編輯profile檔案

2.在/etc/profile底部加入如下内容

JAVA_HOME=/usr/local/java/jdk1.8.0_77

PATH=$JAVA_HOME/bin:$PATH

CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar

export PATH JAVA_HOME CLASSPATH

3.以上,環境變量配置完成。需要注意的是,PATH在配置的時候,

一定要把$JAVA_HOME/bin放在前面,不然使用java指令時,系統會找到以前的java,

再不往下找了。這樣java這個可執行檔案運作的目錄其實不在$JAVA_HOME/bin下,

而在其它目錄下,會造成很大的問題。

4.還要注意,以前其它教程寫的CLASSPATH=$JAVA_HOME/lib.tools.jar,

不知道以前的版本是怎麼樣的,現在的版本是沒有這樣的jar包的。

5.最後使用source /etc/profile讓profile檔案立即生效。

指令測試

使用javac指令,不會出現command not found錯誤

使用java -version,出現版本為java version "1.8.0_77"

echo $JAVA_HOME, echo $CLASSPATH, echo $PATH,看看自己的配置是否都正确。

安裝Solr5.3

去http://www.apache.org/dyn/closer.lua/lucene/solr/5.3.0下載下傳Solr安裝檔案solr-5.3.0.tgz。

将solr-5.3.0.tgz檔案放到/tmp目錄下,執行如下腳本:    

# cd /tmp    

# tar -zxvf solr-5.3.0.tgz // 解壓壓縮包

建立應用程式和資料目錄

# mkdir -p /data/solr 

建立運作solr的使用者并賦權

# groupadd solr    

# useradd -g solr solr    

# chown -R solr.solr /data/solr

安裝solr服務

# solr-5.3.0/bin/install_solr_service.sh solr-5.3.0.tgz -d /data/solr -i /usr/local/solr

檢查服務狀态   

# service solr status

将會看到如下輸出:   

Solr process 29692 running on port 8983    

{    

  "solr_home":"/data/solr/data/",    

  "version":"5.3.0 1696229 - noble - 2015-08-17 17:10:43",    

  "startTime":"2015-09-16T01:32:03.919Z",    

  "uptime":"0 days, 0 hours, 3 minutes, 6 seconds",    

  "memory":"89.8 MB (%18.3) of 490.7 MB"

}

http://你的ip::8983/solr 這個是管理界面

例如:http://192.168.31.129:8983/solr/

搜尋方案 solr+php 安裝配置
搜尋方案 solr+php 安裝配置

http://你的ip::8983/solr 這個是管理界面

2,設計你自己的搜尋索引

http://你的ip::8983/solr 這個是管理界面,選擇你建立的core

隻關注 add Documents 和 query 即可,一個事加索引一個事查詢,特别容易了解

add Documents界面,已經有例子,索引了兩個字段 id和title ,你改下資料送出

Query 界面 q=*:* 查詢所有

q=title:a* 查詢title為a開頭的

簡單玩幾次很容易明白

現在有id,title 我想添加一個自己的字段,type怎麼辦?

去data目錄grep "title", 找到id和title的配置項,類似:

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

參考下填寫上type即可

service solr stop/start 重新開機服務

回到管理界面,添加資料,假設你要聯合搜尋title和type

那麼 q= title:xx fq= type:xx, 多加一個fq明白了吧

3,寫一個php程式

經過1,2個研究,基本能做到建立資料,查出資料現在就寫一個php程式完成這些功能

參考: PHP: Solr - Manual

SolrInputDocument 輸入文檔

SolrClient 這個是使用者連接配接solr伺服器

SolrQuery 這個是建構搜尋條件

直接上程式好了:

class Search
{
	private $client;

	public function __construct() {
		$options = [
			'hostname' => 'localhost', //solr伺服器的ip
			'path' => 'solr/corename', //這個解決core的問題,corename就是你的core
			'wt' => 'json',
		];

		$this->client = new \SolrClient($options); 
	}

	public function addIndex($id, $type, $content) {//加索引的函數
		$doc = new \SolrInputDocument();

		$doc->addField('id', $type . "." . $id); //保證id唯一我把type加上了
		$doc->addField('type', $type);
		$doc->addField('title', $content);
		$client = $this->client;

		$updateResponse = $client->addDocument($doc);
		$client->commit(); //一定要commit才能立即生效

		$ret = ($updateResponse->getResponse());
		if ( isset($ret->responseHeader['status']) ) {
			return $ret->responseHeader['status'] == 0?true:false;
		}
		return false;
	}

	public function search($key, $type=0, $page=0, $limit=15) {
		$query = new \SolrQuery();

		$query->setQuery('title:' . $key . "*"); //這個是設定keyword
		$query->setStart($page); //分頁的
		$query->setRows($limit);
		if($type) {
			$query->addFilterQuery('type:' . $type); //用到fq了
		}
		$query->addField('id')->addField('title')->addField('type'); //這裡是你要查哪些字段
		$client = $this->client;
		$query_response = $client->query($query);

		$response = $query_response->getResponse();
		$response = ($response->response);
		if ( is_array($response->docs) ) {
			foreach($response->docs as &$doc) {
				$id = explode(".", $doc->id);
				if( isset($id[1]) ) {
						$doc->id = $id[1];
				}
				$doc->type = isset($doc->type[0])?$doc->type[0]:'';
			}
		}
		return ($response);
	}
}
           

繼續閱讀