TNTSearch 輕量級全文索引 + 中文分詞


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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM