轻量级全文检索引擎 TNTSearch 和中文分词
之前全文检索一直用的Xunsearch
, 但对于大多数中小项目来说, 用Xunsearch
, Elastic
总有点杀鸡用牛刀的感觉,所以想找一个轻量级的解决方案,碰巧在论坛看到一篇Summer
对TNTSearch
介绍的一个
贴子 《TNTSearch - PHP 实现的全文索引引擎》,觉得很符合需求。
TNTSearch 的基本原理是用SQLite
作为索引数据库,将要索引的字段进行分词,然后建立基于关键词的倒排索引。核心是2
张表,一张存放分词后的关键词, 另一张存放关键词与文档对应的关系(相当于多对多的中间表)。
当用户输入一个查询时,将要查询的短语分词得到各个关键词,分别查询出每个关键词对应的文档ID
, 再按文档中命中的关键词个数进行排序。
官方也提供了Laravel Scout
的驱动 teamtnt/laravel-scout-tntsearch-driver,用起来很方便。唯一的不足就是对中文支持的不够,因为默认的分词器是以标点符号、特殊符号和空格为分隔符进行分词。
namespace TeamTNT\TNTSearch\Support;
class Tokenizer implements TokenizerInterface
{
public function tokenize($text)
{
$text = mb_strtolower($text);
return preg_split("/[^\p{L}\p{N}]+/u", $text, -1, PREG_SPLIT_NO_EMPTY);
}
}
为了解决这个问题,我结合两个常用的php
分词组件:scws 和 jieba-php,改写了官方的Laravel Scout
驱动包, 加入了中文分词功能,发布到packagist
上面。
packagist
: vanry/laravel-scout-tntsearch
github
: https://github.com/vanry/laravel-scout-tnt...
有需要的同学可以去看下,readme
上有使用说明,如果觉得对你有帮助,欢迎star
和提issue
:smiley:。
本作品采用《CC 协议》,转载必须注明作者和本文链接
模型支持联表搜索吗?文章title一个表,文章内容另一个表
@xuanjiang1985 可以 只要修改下
toSearchableArray
方法就行github 上的 composer 命令写的包名好像错的。通过 packagist 上的命令安装成功了composer require vanry/laravel-scout-tntsearch
@Chirs readme上的包名是写错了 感谢指正
@Vanry :smiley:
大佬是直接按照github的执行下来就行了吗?我搜索没成功
emm 问一下作者还更新么 我发现scws和jieba的更新频率都好低 scws已经两年没维护了
还在维护的 分词算法已经很成熟了 经常更新的是自己的词库就行
当被搜索的表的数据发生了变化,需要重新更新表tnt表里面的内容,否则会导致新增的内容搜索不到,请问一下大神,这个怎么实现呢?
SQLSTATE[HY000]: General error: 10 disk I/O error
tntsearch:import
报这个io错误是啥原因呢