ArangoDB 如何在对象数组中搜索不区分大小写的子字符串

xvw2m8pv  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(174)

ArangoDB中,我正在使用一个测试集合,该集合是从他们的网站下载的csv格式的IMDB数据集。电影文档的结构如下:

movies:
{
    _key: 123456,
   name: "Movie title",
   ... ,
   releases: [
      { title: "Local title",
        region: 'US',
        language: 'en',
        ... },
      { title: "Other title",
        region: 'GB',
        language: '??'
        ... }
   ]
}

我已经在movies.releases[*].title字段上创建了一个索引,我对查询该字段很感兴趣,不仅通过相等性,而且通过使用不区分大小写和子字符串匹配。
问题是,唯一一种使用索引的查询是当我这样做的时候:

FOR doc IN movies:
    FILTER 'search' IN doc.releases[*].title

这样,我只能以区分大小写的方式匹配整个字符串:我如何以不区分大小写方式查找子字符串?
我不能使用全文索引,因为ArangoDB不支持在数组中使用它,而且我不能使用LOWER()CONTAINS(),因为它是一个数组。
有什么想法吗?
谢谢你!

7rtdyuoh

7rtdyuoh1#

您可以嵌套搜索,这样您就可以在数组中进行搜索,而无需使用'[*]'符号来应用约束。
下面的示例在每个releases数组中执行搜索,查找不区分大小写的匹配项,如果找到匹配项则返回。
如果至少有一个发行版有匹配项,则FILTER函数将只返回电影。

FOR doc IN movies
    LET matches = (
        FOR release IN doc.releases
            FILTER CONTAINS(LOWER(release.title), LOWER('title'))
            RETURN release
    )
    FILTER LENGTH(matches) > 0
RETURN doc

直接将'title'更改为参数。
注意:为了减轻查询压力,matches变量的目标是,如果存在包含您的关键字的release,则LENGTH属性大于0。
上面的函数有一行RETURN release,当你不阅读它的时候,它可能会返回大量的数据,所以另一种选择是用RETURN true替换该行,因为这是强制matches成为一个数组并使LENGTH大于0所需要的。

相关问题