大家好!
我建了一个全文搜索框架,可以在GML里跑,不需要任何扩展或者外部DLL。
这个框架啥功能
- 支持多种搜索模式:精确搜索、模糊搜索、前缀搜索、混合搜索以及n-gram搜索(支持 typos tolerance)
- 支持 BM25 或 TF-IDF 评分、字段加权、停止词以及持久化功能
在游戏里怎么使用
- 搜索机制:
- 物品/装备数据库 – 玩家可以通过名称或描述搜索物品
- 文档/帮助系统 – 玩家可以通过名称或描述搜索文档
- 玩家日志 – 玩家可以通过关键词搜索日志
- 物品过滤 – 玩家可以通过关键词过滤物品
简单示例
// 只需初始化一次
gmls_init();
// 增加一个带权字段的文档
gmls_add_document_weighted("sword1", "A sharp steel blade",
{title: "钢剑", tags: ["武器"]});
// 开始搜索
var 查找结果 results = gmls_search("钢", 10);
for (var i = 0; i < array_length(results); i++) {
show_debug_message(results[i].document.metadata.title);
}
特征
- 模糊搜索 – 查找 “zleda”会返回“zelda”
- 前缀搜索 – 完成前缀的字符串时,会显示匹配的前缀
- 混合搜索 – 在找到 exact 前缀,会使用 fallback 值做为额外查找前缀
- n-gram 搜索 – 根据前几位字符进行匹配,而不是依靠整个字符串
- 持久性 –保存整个索引到JSON文件中,从而可以在不同游戏场景间进行反复利用。
- BM25 分数 – 得出比 TF-IDF 分数更好的搜索结果。
- 检查 DS 内存后,有时会导致应用程序崩溃,因此内存使用必须非常谨慎。
例子实例:物品数据库
var items = [
{ id: "sword1", name: "Iron Sword", desc: "Basic iron sword", type: "weapon" },
{ id: "potion1", name: "Health Potion", desc: "Restores 50 HP", type: "consumable" }
];
for (var i = 0; i < array_length(items); i++) {
var it = items[i];
gmls_add_document_weighted(it.id, it.desc,
{title: it.name, tags: [it.type]});
}
// 玩家进行搜索
var search_results = gmls_search("iron", 5);
if (array_length(结果) == 0) {
search_results = gmls_fuzzy_search("iron", 5, 0.6);
}
保存、读取玩家日志
// 保存
var saveStr = gmls_save_to_string();
var 文本 = 文本_create_string(16);
文本_create_string(文本, saveStr);
file_text_write_string(file, 文本);
// 读取
gmls_load_from_string(loadedStr);
要求
- GameMaker 2024+以上(只要大多数版本都行)
- 不需要任何扩展或外部文件,但在持久化时需要使用 JSON 文件。
限制
- 词干提取功能尚未被实现(当前仅作为 PlaceHold)
- 部分支持 UTF-8 多字节字符
- 内存会随着增多的唯一词汇而增长(50,000 个文档约占 200-300 MB)
全部文档、API 参考文档以及更多示例
GitHub: github.com/erkan612/GMLiteSearch
欢迎提问和反馈。
评论 (0)