phpcms全文检索功能实现(集成sphinx)

sphinx配置

sphinx是俄罗斯人开发的一个搜索引擎,基于c++编写,具有强大的检索能力,本身支持中文单个字符的检索,中文分词需要额外的插件Coreseek,但该插件已很久未更新,github用户eric1688基于sphinx 2.2.9版本改写了可以较好支持中文分词的sphinx for chinese,本文配置均基于此版本,下载地址在此,向作者致敬。
另:如果是别的系统,建议使用elastic search开发,对中文分词的支持更完善一些,社区更为活跃,但需求不复杂的话,sphinx已足够,而且配置相比更方便些。

本文基于ubuntu 18.04安装sphinx,从上述地址下载压缩包,以下示例大部分基于作者的说明

下载解压

$ git clone https://github.com/eric1688/sphinx
$ cd sphinx

编译(假设安装到/usr/local/sphinx目录,下同)

安装gcc 和 mysql

sudo apt update
sudo apt install build-essential
sudo apt install mysql-server

编译安装sphinx

$ ./configure --prefix=/usr/local/sphinx --prefix 指定安装路径 --with-mysql 编译mysql支持 --with-pgsql 编译pgsql支持
$ make
$ make install

安装完成后,sphinx目录下应有bin、etc、share三个子目录,新建data和log两个子目录

配置中文支持

$ tar -xvf xdict_1.1.tar.gz $ /usr/local/sphinx/bin/mkdict xdict_1.1.txt xdict

从xdict_1.1.txt生成xdict文件,xdict_1.1.txt文件可以根据需要进行修改

$ cp xdict /usr/local/sphinx/etc/

sphinx.conf是最关键的一部分,sphinx的运作主要基于该文件。以下是本人的配置文件,结合phpcms数据库进行配置,该文件存放于bin子目录中

主索引数据源
source main
{
    type = mysql

    sql_host = 192.168.91.1 #phpcms所使用数据库地址
    sql_user = sphinx #用户名
    sql_pass = sphinx #密码
    sql_db = phpcms_v9 #phpcms数据库名字
    sql_port = 3306 #数据库端口
    sql_query_pre = SET NAMES utf8
    sql_query_pre = REPLACE INTO v9_sphinx_counter SELECT 1, MAX(searchid) FROM v9_search
    sql_query = SELECT searchid, adddate, siteid, typeid, id as news_id, data FROM v9_search WHERE searchid>=$start AND searchid<=$end sql_query_range="SELECT" 1,max_doc_id from v9_sphinx_counter where counter_id="1" sql_range_step="5000" sql_attr_uint="typeid" sql_attr_timestamp="adddate" sql_query_info="SELECT" * v9_search searchid="$id" } #增量索引数据源 source delta { type="mysql" sql_host="192.168.91.1" #phpcms所使用数据库地址 sql_user="sphinx" #用户名 sql_pass="sphinx" #密码 sql_db="phpcms_v9" #phpcms数据库名字 sql_port="3306" #数据库端口 sql_query_pre="SET" names utf8 into select 1, max(searchid) sql_query="SELECT" searchid, adddate, siteid, typeid, id as news_id, data>=$start AND searchid<=$end sql_query_range="SELECT" 1,max_doc_id from v9_sphinx_counter where counter_id="1" sql_range_step="5000" sql_attr_uint="typeid" sql_attr_timestamp="adddate" sql_query_info="SELECT" * v9_search searchid="$id" } #主索引 index main { source="main" path="/usr/local/sphinx/data/main" charset_type="utf-8" chinese_dictionary="/usr/local/sphinx/etc/xdict" #增量索引 delta indexer mem_limit="128M" searchd listen="9312" #监听端口,配置完成后可用于测试 log="/usr/local/sphinx/log/searchd.log" query_log="/usr/local/sphinx/log/query.log" read_timeout="5" max_children="30" pid_file="/usr/local/sphinx/log/searchd.pid" seamless_rotate="1" preopen_indexes="1" unlink_old="1" binlog_path="/usr/local/sphinx/data" < code></=$end></=$end>

建立索引文件,并开启服务

&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x6267;&#x884C;&#x7684;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x5747;&#x4E3A;/usr/local/sphinx
$ ./indexer --all
$ ./searchd
&#x5047;&#x8BBE;sphinx&#x6240;&#x5728;&#x670D;&#x52A1;&#x5668;ip&#x4E3A;192.168.91.130
$ mysql -h192.168.91.130 -P9306
mysql> select * from main;
+------+------------+--------+--------+---------+
| id   | adddate    | siteid | typeid | news_id |
+------+------------+--------+--------+---------+
|  941 | 1585707168 |      1 |      1 |     231 |
|  942 | 1585707168 |      1 |      1 |     232 |
|  943 | 1585707168 |      1 |      1 |     233 |
|  944 | 1585707168 |      1 |      1 |     234 |
|  945 | 1585707168 |      1 |      1 |     235 |
|  946 | 1585707168 |      1 |      1 |     236 |
|  947 | 1585707168 |      1 |      1 |     237 |
|  948 | 1585707168 |      1 |      1 |     238 |
|  949 | 1585707168 |      1 |      1 |     239 |
|  950 | 1585707168 |      1 |      1 |     240 |
|  951 | 1585707168 |      1 |      1 |     241 |
|  952 | 1585707168 |      1 |      1 |     242 |
|  953 | 1585707168 |      1 |      1 |     243 |
|  954 | 1585707168 |      1 |      1 |     244 |
|  955 | 1585707168 |      1 |      1 |     245 |
|  956 | 1585707168 |      1 |      1 |     246 |
|  957 | 1585707168 |      1 |      1 |     247 |
|  958 | 1585707168 |      1 |      1 |     248 |
+------+------------+--------+--------+---------+
20 rows in set (0.00 sec)

phpcms相关配置和部分文件修改(todo)

phpcms(版本:phpcmsv9 9.6.3)集成了sphinx的接口,也有相关的文档,但对应的sphinx版本较老,因此要正常使用,需要做一定的修改

模块->全站搜索->模块配置
基本配置:”是否启用全站搜索”选择”是”
sphinx全文索引配置:选择启用,服务器主机地址:192.168.91.130 端口号:9312

phpcms>modules>search>index.php

......

//&#x5982;&#x679C;&#x5F00;&#x542F;sphinx
if ($setting['sphinxenable']) {
    $sphinx = pc_base::load_app_class('search_interface', '', 0);
    $sphinx = new search_interface();

    $offset = $pagesize * ($page - 1);
    //&#x56E0;&#x6240;&#x4F7F;&#x7528;&#x7684;sphinx&#x7248;&#x672C;&#x4E0D;&#x652F;&#x6301;&#x201C;id&#x201D;&#x4F5C;&#x4E3A;&#x6392;&#x5E8F;&#x7684;&#x540D;&#x5B57;&#xFF0C;&#x6240;&#x4EE5;&#x7528;news_id&#x66FF;&#x4EE3;&#xFF0C;&#x5E76;&#x975E;&#x5FC5;&#x987B;&#x65B0;&#x95FB;&#x6A21;&#x578B;
    $res = $sphinx->search($q, array($siteid), array($typeid), array($search_time, SYS_TIME), $offset, $pagesize, '@weight desc, news_id desc');

    $totalnums = $res['total'];
    //&#x5982;&#x679C;&#x7ED3;&#x679C;&#x4E0D;&#x4E3A;&#x7A7A;
    if (!empty($res['matches'])) {
        $result = $res['matches'];
    }
}
.......

......

//&#x5982;&#x679C;&#x7ED3;&#x679C;&#x4E0D;&#x4E3A;&#x7A7A;
if (!empty($result) || !empty($commend['id'])) {
    //&#x5F00;&#x542F;sphinx&#x540E;&#x6587;&#x7AE0;id&#x53D6;&#x6CD5;&#x4E0D;&#x540C;
    if ($setting['sphinxenable']) {
        foreach ($result as $_k => $_v) {
            //&#x6839;&#x636E;sphinx&#x7248;&#x672C;&#x4E0D;&#x540C;&#xFF0C;$result&#x6570;&#x7EC4;&#x4E2D;&#x683C;&#x5F0F;&#x7A0D;&#x6709;&#x4E0D;&#x540C;&#xFF0C;&#x6B64;&#x5904;&#x7A0D;&#x4F5C;&#x4FEE;&#x6539;
            // $sids[] = $_v['attrs']['id'];
            $sids[] = $_v['attrs']['news_id'];
        }
        $sort_str = implode(",", $sids);
    }
......

......

/**
* &#x5982;&#x679C;&#x8868;&#x540D;&#x4E3A;&#x7A7A;&#xFF0C;&#x5219;&#x4E3A;&#x9EC4;&#x9875;&#x6A21;&#x578B;
*/
if (empty($this->content_db->model_tablename)) {
$this->content_db = pc_base::load_model('yp_content_model');
$this->content_db->set_model($modelid);
}

if ($setting['sphinxenable']) {
//&#x9875;&#x9762;&#x5C55;&#x793A;&#x7684;&#x641C;&#x7D22;&#x7ED3;&#x679C;&#x6CA1;&#x6709;&#x6309;&#x7167;sphinx&#x7ED9;&#x51FA;&#x7684;&#x6743;&#x91CD;&#x6392;&#x5E8F;&#xFF0C;&#x6B64;&#x5904;&#x8FDB;&#x884C;&#x8C03;&#x6574;
// $data = $this->content_db->listinfo($where, "id desc", 1, $pagesize);
$data = $this->content_db->listinfo($where, "field(id," . $sort_str . ")", 1, $pagesize);
$pages = pages($totalnums, $page, $pagesize);
} else {
$data = $this->content_db->select($where, '*');
$pages = $this->db->pages;
$totalnums = $this->db->number;
}
......

从下载的安装包api目录中找到sphinxapi.php,复制到phpcms>modules>search>classes目录中,并改名为sphinxapi.class.php

配置完毕,如有疑问请留言

Original: https://www.cnblogs.com/captainmoore/p/12659782.html
Author: captainmoore
Title: phpcms全文检索功能实现(集成sphinx)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608217/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java使用Redis删除指定前缀Key

    Java使用Redis删除指定前缀Key // 获取Redis中特定前缀 Set keys = stringRedisTemplate.keys("BLOG_SORT_B…

    Linux 2023年5月28日
    098
  • go语言接口

    接口在底层的实现有两个部分:type 和 data。 在源码中,显式地将 nil 赋值给接口时,接口的 type 和 data 都将为 nil。此时,接口与 nil 值判断是相等的…

    Linux 2023年6月13日
    070
  • 软件工程 统一建模语言(Unified Modeling Language UML) 第4篇随笔

    是一种可视化的语言 规约系统的制品 构造系统的制品 建立系统制品的文档 UML应用范围 可用于对象方法和构件方法 可用于所有应用领域和不同的平台 1.面向对象方法术语/符号 主要有…

    Linux 2023年6月7日
    0117
  • 从前端走向后端

    每次过年回老家聚会,遇到不熟悉的亲戚朋友,经常被问到职业是什么。一开始,我总是很认真的回答这个问题,结果常常引出一番尴尬的问答。 &#x201C;&#x4F60;&…

    Linux 2023年6月6日
    0103
  • 微信白名单获取

    公司在微信WIFI登录项目中,需要在BRAS设备上添加微信服务器的IP地址到白名单列表中,以实现用户连接热点后,能够使用微信中的功能(如:添加公众号),但不能使用其他应用进行上网操…

    Linux 2023年6月14日
    0115
  • Spring MVC处理日期字符串参数自动转换成后台Date类型

    当前台提交日期字符串到后台时,以字符串形式传输,若后台接收时采用Date类型,则会报格式转换错误的异常. 方式一: 将 @DateTimeFormat(pattern = &amp…

    Linux 2023年6月14日
    097
  • 【MQTT】cJSON协议的安装和使用

    cJSON的使用 * – cJSON的简介 – + JSON 名称/值对 + JSON 数字 + JSON 对象 + JSON 数组 – cJS…

    Linux 2023年6月13日
    0115
  • 在 IconFont 上获取图标资源的操作方法与感悟

    如何在 IconFont 上获取图标资源 阿里巴巴矢量图标库网站(https://www.iconfont.cn/)上提供了非常丰富的图标资源,包括 SVG、AI、PNG、字体图标…

    Linux 2023年6月7日
    0112
  • linux的启动流程详解

    linux启动流程 一、第一阶段:BIOS 上个世纪70年代初,”只读内存”(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片…

    Linux 2023年6月7日
    090
  • Docker安装使用及私有仓库搭建

    1 概念 1.1 基本概念 Docker daemon​ 守护进程,运行在宿主机上,用户通过DockerClient客户端Docker命令与Docker daemon交互。Dock…

    Linux 2023年5月27日
    098
  • Java — 注解

    Java 注解(Annotation)又称为 Java 标注,是 Java5 开始支持加入源代码的特殊语法元数据。 Java 语言中的类、方法、变量、参数和包等都可以被标注。 Ja…

    Linux 2023年6月8日
    097
  • 快速上手FastJSON

    作为一名后端开发而言肯定会接触数据,把数据提供给前端或者把数据存储起来,目前比较火热的传输格式是json,给前端传json是再常见不过啦,甚至是往db里面直接存入json。 在ja…

    Linux 2023年6月14日
    083
  • Hystrix 源码解读

    转载请注明出处: 1.引入依赖: 2. 查看自动配置类HystrixCircuitBreakerConfiguration 查看 org.springframework.cloud…

    Linux 2023年6月14日
    0103
  • Docker私有仓库搭建

    Docker私有仓库搭建 1、Docker Registry 网上有很多的 Registry服务器都支持第三方用户注册,而后基于用户名去做自己的仓库,但是使用互联网上的 Regis…

    Linux 2023年6月7日
    0155
  • 我为儿子开发的第一款Android App,用于九九乘法练习

    用一天时间在macbook上安装好了Android Studio For Mac,注意dl.google.com只支持电信网络下载,家里宽带如果是移动或者联通的,使用AS下载And…

    Linux 2023年6月14日
    0101
  • MySQL日志管理之通用日志和慢查询日志

    MySQL的通用日志: 用来记录对数据库的通用操作,包括错误的sql语句等信息。 通用日志可以保存在:file(默认值)或 table(mysql.general_log表) my…

    Linux 2023年6月7日
    0131
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球