轻量级全文检索引擎 TNTSearch 和中文分词

之前全文检索一直用的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-tnt...

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 10

@xuanjiang1985 可以 只要修改下 toSearchableArray 方法就行


// app/Article.php

public function toSearchableArray()
{
    return [
        'id' => $this->id,
        'title' => $this->title,
        'content' => $this->content->body,
    ];
}
6年前 评论

github 上的 composer 命令写的包名好像错的。通过 packagist 上的命令安装成功了composer require vanry/laravel-scout-tntsearch

6年前 评论

模型支持联表搜索吗?文章title一个表,文章内容另一个表

6年前 评论

@Chirs readme上的包名是写错了 感谢指正

6年前 评论

大佬是直接按照github的执行下来就行了吗?我搜索没成功

file

6年前 评论

emm 问一下作者还更新么 我发现scws和jieba的更新频率都好低 scws已经两年没维护了

6年前 评论

还在维护的 分词算法已经很成熟了 经常更新的是自己的词库就行

5年前 评论

当被搜索的表的数据发生了变化,需要重新更新表tnt表里面的内容,否则会导致新增的内容搜索不到,请问一下大神,这个怎么实现呢?

4年前 评论
Vanry (楼主) 4年前

SQLSTATE[HY000]: General error: 10 disk I/O error tntsearch:import报这个io错误是啥原因呢

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!