linux 环境部署
-
先安装java环境 ,需要Java Runtime Environment(JRE) 1.7或更高版本
-
下载5.5版本的solr zip包 http://mirror.bit.edu.cn/apache/lucene/solr/5.5.0/
-
解压到当前目录unzip -o solr-5.5.0.zip -d ./
-
创建应用程序目录mkdir -p /usr/local/solr
-
svn 代码solr_project/ check out 至 /data目录下
-
创建运行solr的用户并赋权
-
# groupadd solr
-
# useradd -g solr solr
-
# chown -R solr.solr /data/solr_project/solr_cores /usr/local/solr
-
-
安装solr服务solr-5.5.0/bin/install_solr_service.sh solr-5.5.0.zip -d /data/solr_project/solr_cores -i /usr/local/solr
-
检查服务# service solr status
-
/data/solr_project/README.txt里有增加core,删除core重启core介绍
-
solr_cores是solr存放core的目录
-
新增core配置参考solr_cores/demo_core配置,修改conf里的managed-schema最后的字段信息
-
新增core方法:复制demo_core,重命名为目标target_core,修改配置字段信息后,执行脚本./solr_s/add_core.sh target_core
-
修改配置后需要重启solr,执行脚本./solr_cores/restart_solr.sh即可
-
import_scripts存放导入core数据的脚本,对应core命名
-
configs放置一些配置信息
-
hnlog_文件夹存放索引更新的日志
-
includes存放一些公用类
-
-
扩展类添加到(如ik分词)/usr/local/solr/solr/server/solr-webapp/webapp/WEB-INF/lib
更新core的scheme字段配置与导数据
-
solr_project已加入版本控制:svn://192.168.2.231/solr_project
-
配置文件,solr_project/solr_cores/demo_core/conf/managed-schema,对应demo_core
-
修改字段配置后重启solr脚本./restart_solr.sh
-
导数据脚本solr_project/import_scripts/demo_core.php,对应core名称
添加ik中文分词
-
将solr_project/inluces里的ik jar包放进/usr/local/solr/solr/server/solr-webapp/webapp/WEB-INF/lib
-
将jar包中ext.dic IKAnalyzer.cfg.xml stopword.dic复制进/usr/local/solr/solr/server/solr-webapp/webapp/WEB-INF/classes
-
solr_project/solr_cores/restart_solr.sh会将ext.dic、stopword.dic复制到上面的classes目录,自动更新扩展词库
其他说明
-
q - 查询字符串,必须的。
-
fl - 指定返回那些字段内容,用逗号或空格分隔多个。
-
start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
-
rows - 指定返回结果最多有多少条记录,配合start来实现分页。
-
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降 * 序。
-
wt - (writer type)指定输出格式,可以有 xml, json, php, phps。
-
fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的
-
检索运算符
-
: 指定字段查指定值,如返回所有值:
-
? 表示单个任意字符的通配
-
* 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)
-
~ 表示模糊检索,如检索拼写类似于“roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。 邻近检索,如检索相隔10个单词的“apache”和“jakarta”,“jakarta apache”~10
-
^ 控制相关度检索,如检索jakarta apache,同时希望去让“jakarta”的相关度更加好,那么在其后加上““符号和增量值,即jakarta4 apache
-
布尔操作符AND、||
-
布尔操作符OR、&&
-
布尔操作符NOT、!、-(排除操作符不能单独与项使用构成查询)
-
+ 存在操作符,要求符号”+“后的项必须在文档相应的域中存在
-
() 用于构成子查询
-
[] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
-
{}不包含范围检索,如检索某时间段记录,不包含头尾,date:{200707 TO 200710}
-
” 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : “
require(search/vendor/autoload.php');
class EcsSolrSearch
{
private $config;
private $client = '';
function __construct($config = null)
{
if (!$config) {
$this->config = array(
'endpoint' => array(
'localhost' => array(
'host' => C('SOLR_HOST'),
'port' => C('SOLR_PORT'),
'path' => C('GOODS_CODE'),
)
)
);
}
$this->client = new Solarium\Client($this->config);
/**
* 查询
*@param $select array
*/
function response($select) {
$query = $this->client->createSelect($select);
$resultset = $this->client->select($query);
$aggregate_list = $select['component']['facetset']['facet'];
foreach ($aggregate_list as $k => $v) {
$$v['field'] = $resultset->getFacetSet()->getFacet($v['key']);
foreach ($$v['field'] as $k1 => $v1) {
if($v1 > 0){
$result[$v['field']][$k1] = $v1;
}
}
}
$result['goods_list'] = array();
foreach ($resultset as $document) {
$row = array();
// the documents are also iterable, to get all fields
foreach ($document as $field => $value) {
// this converts multivalue fields to a comma-separated string
if (is_array($value)) {
$value = implode(', ', $value);
}
$row[$field] = $value;
}
if(!empty($row)){
$result['goods_list'][] = $row;
}
}
return $result;
}
}
构造select
$select = array(
'query' => $query_string,
'start' => $start,
'fields' => array(),
'rows' => 2,
//'sort' => array($this->sortArr[$sort] => 'asc'),
'filterquery' => array(
'maxprice' => array(
'query' => "shop_price:[$price_min TO $price_max]",
),
),
'component' => array(
'facetset' => array(
'facet' => array(
// notice this config uses an inline key value, instead of array key like the filterquery
array('type' => 'field', 'key'=> 'cat_id','field' => 'cat_id'),
array('type' => 'field', 'key'=> 'brand_id','field' => 'brand_id'),
)
),
),
);