Skip to content

szwsuny/LtSearch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LtSearch - 轻量级搜索引擎


这是一个轻量级搜索引擎,适合中小型网站,仅仅实现快速搜索功能,索引数据量支持500W-1000W,最大勉强支撑3000W数据。


想法

一开始是需求一个小功能,能够实现搜索一句话,然后进行分词,查找到标题带有这些关键词的文章,反馈搜索信息,没有权重,模糊搜索,同义词功能。如果需要更为复杂的功能,建议使用其他大型搜索引擎。


算法

使用bitmap算法(不是位图算法),如果需要学习,请自行查找。索引倒序和Roaring中的bitmap索引(另外两个数组索引,增量索引,我没用)来实现核心功能。


依赖

* PHP >= 7
* SCWS (中文分词工具,通过修改 SplitWords.php来切换分词工具)
* REDIS (非必须,如果设置缓存类型为redis则需要redis扩展)

解释

  1. 搜索的索引建立只需要两个参数 1: 文档ID 2:被索引的内容
  2. 文档ID是一个数字类型,且不能重复,如果你使用在文章搜索上,建议直接使用文章ID作为文档ID.
  3. 搜索结果是没有各种排序的,所以结果采用的是文档ID倒序方式。
  4. 搜索结果返回一个包含所有文档ID的数组。建议缓存这个结果。
  5. 标红,请使用 SzwSuny\LT\Search\SplitWords 取得分词,后处理标红。

配置

Config.php 主要配置文件

/**
*存储的缓存方式,两种 分别为 文件方式和 REDIS方式,具体配置请参见配置文件。
*/
const STORAGE_TYPE = self::STORAGE_IS_FILE; //存储方式

 /**
 * 这里是索引采用的存储方式 分别为 32位 和 64位 int类型。如果你的服务器php支持64位可以设置为64.(建议32)
 */
const INDEX_UNIT_MAX = 32;


/**
 * @brief 缓存结果有效时长,现有的搜索结果会缓存一段时间,单位:毫秒
 */
const RESULT_TTY = 10800;

使用方式

* 可以参考test目录
* 搜索前需要先建立索引

引入项目

require __DIR__ . '/../vendor/autoload.php'; //注意调整所在目录位置

use SzwSuny\LT\Search\LtSearch;

声明对象

$ltSearch = new LtSearch();

建立索引

$ltSearch->add(1,'这里是要被索引的文字');   //第一个参数 1 可以理解为文章ID,搜索结果数组中只会返回这个值。

修改索引

$result = $ltSearch->update(1,'这里是修改后要索引的文字'); //将ID=1的文档修改成新的文字

删除索引

$ltSearch->remove(2);   //删除ID=2的文档索引

搜索

$result = $ltSearch->search('搜索内容',$words);    //搜索结果将会返回符合条件的文档ID数组,$words为引用变量,值为分词结果数组

搜索分页

$resut = $ltSearch->searchPage('搜索内容',1,20,$words);

使用案例

PS:当前已提供分页方式

有好多人直接将结果在数据库中 in 。好几千或者上万数据。我想说活不是这么干的。
请大家了解一下 array_slice 函数,php内置的。此函数使用方式跟 mysql limit 差不多,使用此函数先取出第几页的多少条,然后将结果到数据库中in 这样效率很快。
比如结果集变量为 $result ,每页20条,取第一页。
$ids = array_slice($result,0,20);

第二页为
$ids = array_slice($result,20,20);

第三页为
$ids = array_slice($result,60,20);

然后将 $ids 到数据库中in。这样只取20条速度超级快。

放在最后,查询完的结果集可以放到redis中,查询的文字过一下md5加密当做redis的key,每次查询时候先去取一下redis如果没有在调用搜索功能。记得给key设置过期时间。

版本号说明

xx.xx.0 最后一位为0是正式版
xx.xx.1-99 这种属于测试版本

更新

2019年01月31日 1.1.0 
    发布正式版本

2019年01月31日 1.1.1
    新增搜索结果分页,搜索内容分词返回

2019年01月31日 1.1.3
    新增存储方式切换,支持redis和文件存储
    新增搜索结果缓存一定时间

sunzhiwei 2019-1-29