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环境及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驱动包)粘贴复制到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管理界面即配置完成
三、数据库导入并建立中分分词器
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即可看到导入的数据

四、php客户端调用
<?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可以为数组形式,应用于多选的情况
* @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;
}
/**
* 查询数据
* @param $qwhere 关键字
* @param $fqwhere 附加条件,根据范围检索,适用于数值型
* @param $getField 查询字段
* @param $sort 排序 array('duration'=>'asc') asc:升序,desc:降序
* @param $pageindex 查询页数
* @param $pagesize 每页显示条数
*/
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两侧加*号就能模糊搜索了
}
$query->setQuery($sel);
//关键字检索
//附加条件,根据范围检索,适用于数值型
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;
}
/**
* 分页数据处理
*/
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));
网友评论