solr是一個基于lucene的全文搜索服務器
一隆箩、準備工具
1响驴、tomcat、 jdk
2捶码、solr7.3
3羽氮、mysql-connector-java.jar
4、php-solr擴展
5惫恼、SolrPhpClient
工具包鏈接: https://pan.baidu.com/s/1ByRslAFGn8EU9se5Y1vLCQ 密碼: 6dbi
二档押、服務安裝文件配置
1、安裝java環(huán)境及solr下載;
2令宿、將solr目錄server\solr-webapp\webapp文件夾復制到tomcat的webapps下并修改文件夾名稱為solr叼耙;
3、把solr-7.2.1/server/lib/ext目錄下的所有jar包粒没、solr-7.2.1/dist下的solr-dataimporthandler-6.4.1.jar筛婉、solr-dataimporthandler-extras-6.4.1.jar和solr/server/lib下metrics開頭的5個jar 、mysql-connector-java.jar(mysql驅(qū)動包)粘貼復制到tomcat下的solr項目的WEB-INF/lib目錄下癞松;
4爽撒、在tomcat下的solr項目的WEB-INF下新建classes目錄,然后把solr-6.4.1/server/resources下的log4j.properties粘貼過去拦惋;
5匆浙、把server目錄下的solr文件夾粘貼復制到solr目錄,然后重命名為:solrhome厕妖,作為solr核心文件夾首尼;
6、修改tomcat下的solr項目的WEB-INF/web.xml并注釋掉權限設置
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>F:\solr7\solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
<!--<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>-->
7言秸、啟動tomcat 瀏覽器輸入http://127.0.0.1:8080/solr/index.html#/ 顯示solr管理界面即配置完成
三软能、數(shù)據(jù)庫導入并建立中分分詞器
1、將solr7\server\solr\configsets\下的_default文件夾復制到solr7\solrhome下并更改為jun
2举畸、_default的conf目錄下建立一個db-data-config.xml文件
對應solrconfig.xml里修改為db-data-config.xml
3查排、編輯db-data-config.xml文件
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/db" user="root" password="" />
<document>
<entity name="product" query="select * from product"
>
<field column="id" name="id" />
<field column="title" name="title" />
</entity>
</document>
</dataConfig>
4、F:\solr7\contrib\analysis-extras\lucene-libs找到lucene-analyzers-smartcn-7.3.0.jar復制到webapp\wEB-INF\lib下
5抄沮、修改managed-shchema 加入中文配置
<!-- ChineseAnalyzer -->
<fieldType name="solr_cnAnalyzer" 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>
6跋核、添加庫
7、選擇Schema配置字段
8叛买、點擊DataImport
9砂代、點擊Query即可看到導入的數(shù)據(jù)
四、php客戶端調(diào)用
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/4/27
* Time: 13:45
*/
require_once "Solr/Service.php";
class SolrSearch
{
private static $options = array('hostname' => '127.0.0.1','port' => '8080');
/**
* 設置solr庫
*/
public static function setCore($core)
{
if($core) self::$options['path'] = 'solr/'.$core;
}
/**
* php通過solr文件包連接服務器端
*/
/* public static function solr_server(){
$solr = new Apache_Solr_Service( self::SOLR_HOST, self::SOLR_PORT, self::SOLR_URL );
if ( ! $solr->ping() ) {
echo 'Solr service not responding.';
exit;
}
}
*/
/**
* 增加solr索引
* @param $fieldArr 索引字段及值
* @return bool true
*/
public static function addDocument($fieldArr=array()){
$client = new SolrClient(self::$options);
$doc = new SolrInputDocument();
foreach($fieldArr as $k => $v){
$doc->addField($k,$v);
}
$client->addDocument($doc);
$client->commit();
return true;
}
/**
* 刪除索引
* @param $id 主鍵id id可以為數(shù)組形式率挣,應用于多選的情況
* @return bool true
*/
public static function delDocument($ids){
$client = new SolrClient(self::$options);
if(is_array($ids))
$client->deleteByIds($ids);
else
$client->deleteById($ids);
$client->commit();
return true;
}
/**
* 查詢數(shù)據(jù)
* @param $qwhere 關鍵字
* @param $fqwhere 附加條件刻伊,根據(jù)范圍檢索,適用于數(shù)值型
* @param $getField 查詢字段
* @param $sort 排序 array('duration'=>'asc') asc:升序椒功,desc:降序
* @param $pageindex 查詢頁數(shù)
* @param $pagesize 每頁顯示條數(shù)
*/
public static function selectQuery($qwhere=array(),$fqwhere=array(),$getField=array(),$sort=array(),$pageindex=1,$pagesize=20){
$client = new SolrClient(self::$options);
$query = new SolrQuery();
$sel = '';
foreach($qwhere as $k => $v){
$sel .= ' +'.$k.':'.$v; //對中文分詞的field用這行
// $sel = "{$k} : \"*{$v}*\""; //對英文貌似$v兩側(cè)加*號就能模糊搜索了
}
$query->setQuery($sel);
//關鍵字檢索
//附加條件捶箱,根據(jù)范圍檢索,適用于數(shù)值型
if($fqwhere){
$query->setFacet(true);
foreach($fqwhere as $k => $v)
$query->addFacetQuery($v);
//$query->addFacetQuery('price:[* TO 500]');
}
//查詢字段
if($getField){
foreach($getField as $key => $val)
$query->addField($val);
}
//排序
if($sort){
foreach($sort as $k => $v){
if($v == 'asc')
$query->addSortField($k,SolrQuery::ORDER_ASC);
elseif($v == 'desc')
$query->addSortField($k,SolrQuery::ORDER_DESC);
}
}
//分頁
$query->setStart(self::getPageIndex($pageindex,$pagesize));
$query->setRows($pagesize);
$query_response = $client->query($query);
$response = $query_response->getResponse();
return $response;
}
/**
* 分頁數(shù)據(jù)處理
*/
private static function getPageIndex($pageindex,$pagesize){
if($pageindex<=1)
$pageindex = 0;
else
$pageindex = ($pageindex-1)*$pagesize;
return $pageindex;
}
}
SolrSearch::setCore('jun');
//查詢
$q = array(
'title'=>'星'
);
print_r(SolrSearch::selectQuery($q));