之前全文检索一直用的Xunsearch, 但对于大多数中小项目来说, 用Xunsearch, Elastic总有点杀鸡用牛刀的感觉,所以想找一个轻量级的解决方案,碰巧在论坛看到一篇SummerTNTSearch介绍的一个
贴子 《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分词组件:scwsjieba-php,改写了官方的Laravel Scout驱动包, 加入了中文分词功能,发布到packagist上面。

packagist: vanry/laravel-scout-tntsearch

github: https://github.com/vanry/laravel-scout-tntsearch

有需要的同学可以去看下,readme上有使用说明,如果觉得对你有帮助,欢迎star和提issue :smiley:。