Solr 7 - 多字段查询及 PHP 调用篇

接前文

  1. Solr 7 - CentOS 部署篇
  2. Solr 7 - 中文分词、数据导入、查询 基本使用篇

前文说到 q 参数的使用有点恶心,必须得用 字段:查询内容 的方式

我们来改造一番

多字段查询配置

首先添加一个“多”字段,Schema 页面下 Add Field,按图勾选并添加
添加“多”字段
假设我们现在想让这个 _all 支持(代替)查询 product_namecat_name 字段

继续,在 Schema 页面 Add Copy Field

注意 source 来源是我们已经添加的字段名,如图 product_namecat_name

destination 目标就是我们刚刚创建的“多”字段 _all
添加 Copy 字段
完成后 _all 字段上有如下信息:
_all 字段信息

测试一下

Query 页面中 q 参数填入:_all:衣服 然后 Execute Query
测试 _all 字段查询
成功了,但是我们试试把 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 参数直接填入搜索内容
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,我们来创建一个 Solrapp/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 从部署到基本的开发调用就完成啦,有任何问题欢迎指出哈~(逃)

发布了188 篇原创文章 · 获赞 198 · 访问量 211万+

猜你喜欢

转载自blog.csdn.net/maxsky/article/details/86614960
今日推荐