接前文
前文说到 q
参数的使用有点恶心,必须得用 字段:查询内容
的方式
我们来改造一番
多字段查询配置
首先添加一个“多”字段,Schema 页面下 Add Field,按图勾选并添加
假设我们现在想让这个 _all
支持(代替)查询 product_name
和 cat_name
字段
继续,在 Schema 页面 Add Copy Field:
注意 source
来源是我们已经添加的字段名,如图 product_name
及 cat_name
destination
目标就是我们刚刚创建的“多”字段 _all
完成后 _all
字段上有如下信息:
测试一下
Query 页面中 q
参数填入:_all:衣服
然后 Execute Query
成功了,但是我们试试把 q
改为:衣服
,去掉那个 _all
试试
很可惜,什么结果都没有。不用担心,我们在下方的 df
参数内填入 _all
试试,是不是结果又出来了?
df
参数指 default,即默认查询字段,我们只需要配置了这货,在 q
参数传值时就可以不用指定查询字段了!
所以…编辑 /var/solr/data/MyCore/conf/solrconfig.xml
文件:
<!-- 搜索“/select”,在 700 行左右找到下方内容 -->
<!-- 将 <str name="df"> 的注释去掉,中间的 text 修改为我们添加的“多”字段 _all -->
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">20</int>
<!-- Default search field -->
<str name="df">_all</str>
</lst>
</requestHandler>
保存重载 MyCore,再到 Query 页面试试,q
参数直接填入搜索内容
没有任何问题,一个简单的进阶设置就搞定啦!
结合 PHP 调用
准备
我们这儿使用 Lumen 框架进行示例,主流的如 ThinkPHP 5+、Laravel 等支持 Composer 等框架可以非常方便的让我们调用 Solr
Composer 添加 solarium/solarium
,项目根目录执行:
composer require solarium/solarium
然后我们在项目的 config
目录下创建 solr.php
文件:
// config/solr.php
<?php
return [
'endpoint' => [
'localhost' => [
// Solr 地址
'host' => '10.8.8.1',
// 默认端口 8983
'port' => 8983,
// 默认路径为 /solr/,这里需要带上 Core 路径
'path' => '/solr/MyCore/',
]
]
];
在上述提到的框架中,我们都可以通过助手函数 config()
获取到相应的配置文件内容。
当然这个在 Lumen 框架中不是那么好用,我们需要手动在 bootstrap/app.php
文件中加上:
// 非 Lumen 框架可忽略这个东西
$app->configure('solr');
// 两种写法均可
app()->configure('solr');
有兴趣的小伙伴可以自己写一个遍历 config/
目录配置文件的方法然后在框架中循环加载。
实际的
OK,我们来创建一个 Solr 类 app/Http/Common/Solr.php
:
<?php
namespace App\Http\Common;
use Solarium\Client;
use Solarium\QueryType\Select\Result\Result;
class Solr {
// 这里的注释不要删除,如果使用 IDEA/PhpStorm 一类的 IDE 可以更好的支持代码提示。
/** @var $client \Solarium\Core\Client\Client */
protected static $client;
protected static $solr;
public static function getInstance() {
if (!self::$solr) {
self::$solr = new self();
self::$client = new Client(config('solr'));
}
return self::$solr;
}
/**
* @param string $query 查询内容
* @param int $page 页码,默认 1
* @param int $length 页长,默认 20
* @param string $type 返回数据类型,默认 json,支持 xml、php、csv 等
*
* @return string 返回查询结果
*/
public function query($query, $page = 1, $length = 20, $type = 'json') {
$querySelect = self::$client->createQuery(self::$client::QUERY_SELECT);
$querySelect->addParam('q', $query);
$querySelect->addParam('wt', $type);
$start = $page <= 1 ? 0 : ($page - 1) * $length;
$querySelect->addParam('start', $start);
$querySelect->addParam('rows', $length);
$resultSet = self::$client->execute($querySelect);
return $resultSet->getResponse()->getBody();
}
}
如上一个简单的包含查询功能的 Solr 类就建好了
测试
随便写一个 TestController
测试一下:
echo Solr::getInstance()->query('洗衣机');
网页中美化 CSS、Json:Prism Pretty - Chrome 网上应用店
到这儿我们的 Solr 7 从部署到基本的开发调用就完成啦,有任何问题欢迎指出哈~(逃)