TNTSearch 轻量级全文索引+中文分词

选用 TNTSearch 的原因:轻,方便移植,不需要额外安装服务,能减少后期维护的工作量。搜索的效果也还不错,可以满足大多数项目场景,如果对性能和精准度要求较高,还是使用 Elasticsearch 吧。因TNTSearch使用的逗号空格分词,所以我们还需要一个中文分词的服务。
这里我选用的是 fukuball/jieba-php 选它的原因也是轻量,也不需要过多的依赖,部署方便。

TNTSearch 集成教程
https://laravel-china.org/articles/3702/full-text-indexing-engine-implemented-in-tntsearch-php
教程讲的很清楚,也没有什么坑,根据教程一步步来就可以了。这里就不在重复了。

下面主要说说 TNTSearch 怎么集成 fukuball/jieba-php 中文分词。

安装 fukuball/jieba-php

composer composer require fukuball/jieba-php:dev-master

注:fukuball/jieba-php 分词对内存有要求,如果内存过小,分词的时候可能会报错。

开始集成

  1. 修改配置 app/config/scout.php 增加 jieba 的配置项

    'tntsearch' => [
    ... 'tokenizer' => [
    ...
    'jieba' => [
    'dict' => 'small',
    ], ....
    ],
    ...
    ],
  2. 新建一个 Tokenizer
    app/Handlers/TokenizerHandler.php

    <?php
    namespace App\Handlers;
    use Fukuball\Jieba\Jieba;
    use Fukuball\Jieba\Finalseg;
    use TeamTNT\TNTSearch\Support\TokenizerInterface;
    class TokenizerHandler implements TokenizerInterface
    {
    public function __construct(array $options = [])
    {
    Jieba::init($options);
    Finalseg::init($options);
    } public function tokenize($text, $stopwords = [])
    {
    return is_numeric($text) ? [] : $this->getTokens($text, $stopwords);
    } public function getTokens($text, $stopwords = [])
    {
    $split = Jieba::cutForSearch($text);
    return $split;
    }
    }
  3. 新建服务提供者,用来取代 laravel-scout-tntsearch-driver 默认的服务提供者
    app/Providers/ScoutServiceProvider.php

    <?php
    namespace App\Providers;
    use TeamTNT\TNTSearch\TNTSearch;
    use Laravel\Scout\EngineManager;
    use TeamTNT\Scout\Console\ImportCommand;
    use TeamTNT\Scout\Engines\TNTSearchEngine;
    use TeamTNT\Scout\TNTSearchScoutServiceProvider;
    use App\Handlers\TokenizerHandler;
    class ScoutServiceProvider extends TNTSearchScoutServiceProvider
    {
    public function boot()
    {
    $this->app[EngineManager::class]->extend('tntsearch', function ($app) {
    $tnt = new TNTSearch();
    $driver = config('database.default');
    $config = config('scout.tntsearch') + config("database.connections.{$driver}");
    $tnt->loadConfig($config);
    # 注入中文分词服务
    $tnt->setTokenizer(new TokenizerHandler(config('scout.tntsearch.tokenizer.jieba')));
    $tnt->setDatabaseHandle(app('db')->connection()->getPdo());
    $this->setFuzziness($tnt);
    $this->setAsYouType($tnt);
    return new TNTSearchEngine($tnt);
    });
    if ($this->app->runningInConsole()) {
    $this->commands([
    ImportCommand::class,
    ]);
    }
    }
    }
  4. 注册服务提供者,将 TNTSearchScoutServiceProvider 取消注册
    app/config/app.php
    ...
    'providers' => [
    ...
    SocialiteProviders\Manager\ServiceProvider::class,
    # TeamTNT\Scout\TNTSearchScoutServiceProvider::class,
    ...
    ]
    ...

至此集成完毕,可以去测试一下效果。
当然也可以根据 laravel-scout-tntsearch-driver 源码修改,然后打包成一个自己包,只是这样以后就失去了原包的升级服务。可以自行取舍,没有对错,适合就好。

如果有问题可以一起探讨一下。
我开源的 laraCMS 已集成了 TNTSearch ,如果有兴趣可以去github查看源码,也可以去在线体验

Github: https://github.com/wanglelecc/laracms
预览:https://www.56br.com/

TNTSearch 轻量级全文索引 + 中文分词的更多相关文章

  1. 轻量级的中文分词工具包 - IK Analyzer

    IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Luence为应用 ...

  2. Lucene的中文分词器IKAnalyzer

    分词器对英文的支持是非常好的. 一般分词经过的流程: 1)切分关键词 2)去除停用词 3)把英文单词转为小写 但是老外写的分词器对中文分词一般都是单字分词,分词的效果不好. 国人林良益写的IK Ana ...

  3. Elasticsearch安装ik中文分词插件(四)

    一.IK简介 IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Lu ...

  4. Java实现敏感词过滤 - IKAnalyzer中文分词工具

    IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...

  5. IK 中文分词器

    链接:https://github.com/wks/ik-analyzerIKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始,IKAna ...

  6. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十九)ES6.2.2 安装Ik中文分词器

    注: elasticsearch 版本6.2.2 1)集群模式,则每个节点都需要安装ik分词,安装插件完毕后需要重启服务,创建mapping前如果有机器未安装分词,则可能该索引可能为RED,需要删除后 ...

  7. Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词

    一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在p ...

  8. 推荐十款java开源中文分词组件

    1:Elasticsearch的开源中文分词器 IK Analysis(Star:2471) IK中文分词器在Elasticsearch上的使用.原生IK中文分词是从文件系统中读取词典,es-ik本身 ...

  9. 搜索引擎ElasticSearch系列(五): ElasticSearch2.4.4 IK中文分词器插件安装

    一:IK分词器简介  IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源 ...

随机推荐

  1. [NOIp2014提高组]解方程

    思路: 系数的范围有$10^{10000}$,但是用高精度做显然不现实,因此可以考虑一个类似于“哈希”的做法, 对方程两边同时取模,如果取的模数足够多,正确率就很高了. 中间对多项式的计算可以使用$O ...

  2. 有向图强连通分量的Tarjan算法和Kosaraju算法

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  3. hdu 4417 区间内比h小的数 划分树

    二分查找最近一个比h小的数 #include<cstdio> #include<iostream> #include<algorithm> #include< ...

  4. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A. Broken Clock 水题

    A. Broken Clock 题目连接: http://codeforces.com/contest/722/problem/A Description You are given a broken ...

  5. 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...

  6. centos 7 安装 rvm 超时

    关于 rvm  建议没有变成基础的朋友不要选择这种方式安装   不然很有可能到 对ruby很感兴趣想学到放弃的 因为ruby实在是太麻烦 太麻烦  你会遇到各种各样的问题   我之前安装过一次rvm ...

  7. AES Test vectors

    Table of content List of test vectors for AES/ECB encryption mode AES ECB 128-bit encryption mode AE ...

  8. 网站性能工具-YSlow的23个规则-网站性能优化

    1. 减少HTTP请求次数 合并图片.CSS.JS,改进首次访问用户等待时间. 2. 使用CDN 就近缓存==>智能路由==>负载均衡==>WSA全站动态加速 3. 避免空的src和 ...

  9. webpack原理与实战

    webpack是一个js打包工具,不一个完整的前端构建工具.它的流行得益于模块化和单页应用的流行.webpack提供扩展机制,在庞大的社区支持下各种场景基本它都可找到解决方案.本文的目的是教会你用we ...

  10. 淘宝接口 TopAPi

    演示一下调用淘宝的接口,让大家心里有个数, 很简单,新建一个工程,拖一个IDHttp,Button和Memo到窗体上去 然后在这个Button的OnClick事件中写入如下代码: [delphi] v ...