大家好!

我建了一个全文搜索框架,可以在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

欢迎提问和反馈。