Emby高级教程:中文搜索增强实现教程
【写作说明】
整体思路和操作来源于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为例:
断开并删除链接即可
【替换文件】
请将修改的两个dll文件替换源文件
将修改后的db数据库文件替换源文件
在
wangfenjin/simple 项目下下载对应平台下的simple编译好的插件并放在和数据库相同的目录下。注意:群晖请下载 libsimple-linux-ubuntu-18.04.zip,实在不行的请自行编译。
在linux下替换文件时请注意修改权限。
【总结】
如果你看的一头雾水请不要尝试,对linux命令了解甚少请不要尝试。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
独猎鹏
校验提示文案
懂不懂
校验提示文案
Cabireat
校验提示文案
火染轩辕
校验提示文案
神奇萝卜
校验提示文案
天河之东
校验提示文案
卖酱油和方便面
校验提示文案
家庭影音玩家
校验提示文案
kennylee60
校验提示文案
灵KOYB
校验提示文案
辉6辉
校验提示文案
weicj
校验提示文案
值友5815402669
校验提示文案
joeyzhou1980
校验提示文案
值友2482818035
校验提示文案
值友2482818035
校验提示文案
joeyzhou1980
校验提示文案
值友5815402669
校验提示文案
weicj
校验提示文案
辉6辉
校验提示文案
灵KOYB
校验提示文案
kennylee60
校验提示文案
家庭影音玩家
校验提示文案
卖酱油和方便面
校验提示文案
天河之东
校验提示文案
懂不懂
校验提示文案
神奇萝卜
校验提示文案
火染轩辕
校验提示文案
独猎鹏
校验提示文案
Cabireat
校验提示文案