ArangoDB:同时查询多个字段以进行部分匹配

ArangoDB:同时查询多个字段以进行部分匹配,arangodb,Arangodb,我有一个包含产品信息(SKU、型号、说明等)的数据库,我希望有一个相对快速的搜索功能,用户只需从任何文本字段中键入几个字母或一个单词,然后在任何这些字段中获得包含该短语的产品列表 数据库中的项目数可能不会超过100000 在不创建复杂查询的情况下,实现这一点最简单的方法是什么?听起来您在寻找自动完成。有很多方法可以做到这一点 索引 无论您选择何种解决方案,您都希望在数据上添加一些索引。我建议在您要搜索的所有内容中添加一个skiplist,并在任何长格式文本(如产品描述)上添加一个额外的全文索引。

我有一个包含产品信息(SKU、型号、说明等)的数据库,我希望有一个相对快速的搜索功能,用户只需从任何文本字段中键入几个字母或一个单词,然后在任何这些字段中获得包含该短语的产品列表

数据库中的项目数可能不会超过100000


在不创建复杂查询的情况下,实现这一点最简单的方法是什么?

听起来您在寻找自动完成。有很多方法可以做到这一点

索引 无论您选择何种解决方案,您都希望在数据上添加一些索引。我建议在您要搜索的所有内容中添加一个skiplist,并在任何长格式文本(如产品描述)上添加一个额外的全文索引。字符串比较使用SkipList,而只有
全文
搜索将利用全文索引

质疑 你在这里有一些选择

喜欢

您可以运行类似以下内容的搜索:

for product in warehouse
    filter like(product.model, @searchTerm, true) or
           like(product.sku, @searchTerm, true)
    return product
优点:简单的查询语法,一次搜索多个属性,支持子字符串,可以搜索正文的中间部分

缺点:相对较慢

全文 这对于查询来说要复杂得多,但响应速度非常快,并且是我的应用程序用于自动完成的方法

let sku = (for result in fulltext("warehouse", "sku", "prefix:@seacrhTerm")
           return {sku: result.sku, model: result.model, description: result.description}
let model = (for result in fulltext("warehouse", "model", "prefix:@searchTerm")
           return {sku: result.sku, model: result.model, description: result.description}
let description = (for result in fulltext("warehouse", "description", "prefix:@searchTerm")
           return {sku: result.sku, model: result.model, description: result.description}

let resultsMatch = union(sku,model,description)

return resultsMatch
优点:非常快速,响应速度非常快,可以轻松处理非常长的文本体,搜索文本体中的任何位置

缺点:复杂的查询结构,因为要搜索的每个属性都需要一个变量,要搜索的每个属性都需要一个全文索引,最后需要一个并集。您可能需要对联合结果进行联合,这取决于您的搜索需要的高级程度。不支持子字符串搜索

原始字符串比较 只需创建一个查询,过滤大于或等于搜索词但小于搜索词的结果,最后一个字母递增1。示例在我答案的Foxx部分下面的链接中。这充分利用了技术能手

优势:只要场地不太长,速度就非常快。非常容易实现

缺点:不支持子字符串搜索。仅搜索字符串的第一部分。也就是说,您必须知道正在搜索的字段的开头

<>这将很好地用于搜索像模型号码之类的东西,在那里你的用户可能知道它的开头,但是对于像你的用户可能在正文的某个地方搜索单词的描述来说很差。

福克斯 Jan的小食谱示例是一个很好的起点:

我建议将您所做的一切抽象为一个Foxx服务。如果您需要在数据库中动态构建AQL查询,尤其是在需要搜索大量字段和集合并且需要动态生成全文搜索的情况下,这是一种解放

底线
尝试一下,看看哪一个最适合你。我的最佳猜测是,如果您需要搜索产品描述,您会发现全文解决方案是最好的。如果您希望用户总是搜索字段的前几个字母,只需使用skiplist进行比较,因为它非常快。

您觉得我的答案有用吗?