轻量级全文检索引擎 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
。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: