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 分词对内存有要求,如果内存过小,分词的时候可能会报错。
开始集成
修改配置 app/config/scout.php 增加 jieba 的配置项
'tntsearch' => [
... 'tokenizer' => [
...
'jieba' => [
'dict' => 'small',
], ....
],
...
],新建一个 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;
}
}新建服务提供者,用来取代 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,
]);
}
}
}- 注册服务提供者,将 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 轻量级全文索引 + 中文分词的更多相关文章
- 轻量级的中文分词工具包 - IK Analyzer
IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Luence为应用 ...
- Lucene的中文分词器IKAnalyzer
分词器对英文的支持是非常好的. 一般分词经过的流程: 1)切分关键词 2)去除停用词 3)把英文单词转为小写 但是老外写的分词器对中文分词一般都是单字分词,分词的效果不好. 国人林良益写的IK Ana ...
- Elasticsearch安装ik中文分词插件(四)
一.IK简介 IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源项目Lu ...
- Java实现敏感词过滤 - IKAnalyzer中文分词工具
IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...
- IK 中文分词器
链接:https://github.com/wks/ik-analyzerIKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始,IKAna ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十九)ES6.2.2 安装Ik中文分词器
注: elasticsearch 版本6.2.2 1)集群模式,则每个节点都需要安装ik分词,安装插件完毕后需要重启服务,创建mapping前如果有机器未安装分词,则可能该索引可能为RED,需要删除后 ...
- Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词
一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在p ...
- 推荐十款java开源中文分词组件
1:Elasticsearch的开源中文分词器 IK Analysis(Star:2471) IK中文分词器在Elasticsearch上的使用.原生IK中文分词是从文件系统中读取词典,es-ik本身 ...
- 搜索引擎ElasticSearch系列(五): ElasticSearch2.4.4 IK中文分词器插件安装
一:IK分词器简介 IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本.最初,它是以开源 ...
随机推荐
- poj 1797 最短路变形dijkstra
题意:题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量 链接:点我 解题思路:其实这个求最大边可以近似于 ...
- JAVA poi 帮助类
pom.xml 添加引用: <!--poi--> <dependency> <groupId>org.apache.poi</groupId> < ...
- maven -- 问题解决(三)Java compiler level does not match the version of the installed Java project facet
问题: Java compiler level does not match the version of the installed Java project facet 解决方法如下: prope ...
- Docker系列之(四):Win10上运行Docker
1. 前言 Docker最近推出了可以运行在Win10和Mac上的稳定版本,让我们赶紧来体验一下. 2. 安装准备 需要的条件为: 64bit Windows 10,开启Hyper-V 2.1 下载D ...
- JavaMail发送和接收邮件API(详解)
一.JavaMail概述: JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供的JavaMa ...
- C#如何直接调用非托管代码
C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. 调用 COM 对象上的接口方法 我主要讨论从dll中导出函数,基本步骤如下: 1.使用 C# 关键字 s ...
- 前端构建和模块化工具-coolie
[前言] 假设你之前用过前端模块化工具:seajs.requirejs. 用过前端构建工具grunt.gulp, 而且感到了一些不方便和痛苦,那么你能够试试coolie [coolie] 本文不是一篇 ...
- C# 地磅串口编程
C# 地磅串口编程 http://www.cnblogs.com/cancer_xu/archive/2012/09/14/WeighBridge-Com.html http://www.cnblog ...
- 利用Fiddler和Wireshark解密SSL加密流量
原文地址:http://kelvinh.github.io/blog/2014/01/12/decrypt-ssl-using-fiddler-and-wireshark/ Fiddler是一个著名的 ...
- myeclipse 2014 专业版 安装 svn插件
团队合作的项目肯定少不了版本控制,那么现在就看看myeclispe中是如何使用的吧. 开发环境:myeclipse 2014 java 8 tomcate 8 试了网上说的几种方法,都没有成功,最 ...