Emby高级教程:中文搜索增强实现教程

Emby高级教程:中文搜索增强实现教程
2022年08月28日 16:47 什么值得买

作者:jacksky6

【写作说明】

整体思路和操作来源于B站大神 Choyakawa,本人也是小白一枚,只是对自己的操作过程做一个详细记录。

【写作缘由】

Emby 的搜索功能太烂了,中文支持极差。通过分析Emby数据库采用sqlite3,sqlite3的原生FTS索引本来中文搜索就比较烂,所以Emby的搜索烂这也不能完全算是Emby的锅。

Emby本身采用c# net跨平台开发,我们可以通过反编译的方式修改搜索功能,使用wangfenjin大神的simple FTS扩展插件,建立FTS索引搜索,以此来支持中文拼音全拼搜索,中文拼音首字母搜索。

【效果展示】

【simple插件介绍】

simple 是一个支持中文和拼音的 sqlite3 fts5 拓展。它完整提供了 微信移动端的全文检索多音字问题解决方案 一文中的方案四,非常简单和高效地支持中文及拼音的搜索。

【准备工作和注意事项】

1、 .Net反编译工具

  • 推荐使用 dnSpyEx/dnSpy 的最新版本6.2,不要使用 dnSpy/dnSpy 6.1.8,

  • 反编译中所有的修改请使用编辑方法而不是编辑类

2、SQLite 数据库管理软件:所有的都可以,比如Navicat,也可以使用命令行。

3、请自行查找所用平台Emby的安装目录,本教程需要修改三个文件:

  • 软件安装目录下system目录下的SQLitePCL.pretty.dll文件

  • 软件安装目录下system目录下的Emby.Server.Implementations.dll文件

  • 软件安装目录下data目录下的library.db文件

    注意:请做好这三个文件的备份,以防数据丢失。

system文件夹下的dll文件之间存在依赖,建议将system文件夹(包含所有文件)拷贝出来。    

4、所有的修改请在Emby关闭的情况下进行。

5、所用到的工具:dnSpyEx/dnSpy 和 wangfenjin/simple 请自行到全球最大的代码托管网站搜索下载。

【修改SQLitePCL.pretty.dll】

反编译修改 SQLitePCL.pretty.dll 文件中 Emby链接SQLite 数据库的方法,增加允许运行时可加载扩展 sqlite3_enable_load_extension 的 SQLite C - API  调用。

raw.sqlite3_enable_load_extension(sqlite, 1);

【修改Emby.Server.Implementations.dll】

1、点击 文件-----打开 选择 Emby.Server.Implementations.dll

2、修改 Emby FTS5实现,使用自定义 tokenizer

using System.IO;

databaseConnection.Execute("SELECT load_extension('" + Path.Combine(this._config.ApplicationPaths.DataPath, "libsimple") + "');");

还是在这个方法下面,一长串SQL中,修改FTS5 tokenize 为simple

private string GetJoinCommandText 中 @SearchTerm 修改为 simple_query(@SearchTerm)

3、兼容输入法候选词(作者说能省,但是实际测试不能省,省了搜索结果为零),重写CreateSearchTerm方法

  • 需要增加引用System.Text.RegularExpressions

using System.Text.RegularExpressions;

private string CreateSearchTerm(string searchTerm)

{

    string newSearchTerm = searchTerm;

    if (Regex.Matches(searchTerm, "'").Count >= 3)

    {

        newSearchTerm = searchTerm.Replace("'", "");

    }

    return newSearchTerm;

}

4、修改搜索实现部分代码,增强和优化部分功能

if (!string.IsNullOrEmpty(query.NameStartsWith))

{

    query.SearchTerm = query.NameStartsWith;

    query.NameStartsWith = null;

if (!string.IsNullOrEmpty(query.SearchTerm) && query.IncludeItemTypes.Length == 0)

{

query.IncludeItemTypes = new string[]{ "Movie", "Series", "BoxSet", "Audio", "MusicAlbum","MusicArtist"};

}

5、修改EnableJoinFtsSearch

  • 增加Limit=50 的条件限制EnableFts

说明:此处作者给的,增加Limit=50、GroupProgramsBySeries=true两个条件限制EnableFts,实测这样修改的话,搜索页面即时没有结果也会默认出现50个无关结果,所以我只增加了Limit=50的限制。

private bool EnableJoinFtsSearch(InternalItemsQuery query)

{

int? limit = query.Limit;

int num = 50;

return (limit.GetValueOrDefault() == num & limit != null) && (!string.IsNullOrEmpty(query.SearchTerm) || (!string.IsNullOrEmpty(query.Name) && this.IsNameSearchaleWithFts(query.Name)));

}

6、保存Emby.Server.Implementations.dll

【修改SQLite 数据库,重建索引表】

注意拷贝library.db的时候请在Emby关闭的情况下进行,如果有library.db、library.db-shm、library.db-wal三个文件请同时备份并拷贝出来进行修改,修改后一般只剩一个文件:library.db,请用这个文件替换原有的三个文件。

以Mac的Navicat为例:

断开并删除链接即可

【替换文件】

  1. 请将修改的两个dll文件替换源文件

  2. 将修改后的db数据库文件替换源文件

  3. 在 

    wangfenjin/simple 项目下下载对应平台下的simple编译好的插件并放在和数据库相同的目录下。注意:群晖请下载 libsimple-linux-ubuntu-18.04.zip,实在不行的请自行编译。

  4. 在linux下替换文件时请注意修改权限。

【总结】

如果你看的一头雾水请不要尝试,对linux命令了解甚少请不要尝试。

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部