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

问题描述 投票:0回答:1

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(),因为它是一个数组。

有什么想法吗?

谢谢!

arrays search substring contains arangodb
1个回答
0
投票

可以嵌套搜索,使您可以在数组中进行搜索,而不必使用'[*]'表示法来施加约束。

这里是一个在每个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变量的目标是,如果其中包含关键字,则LENGTH属性大于0。

上面的函数有RETURN release行,当您不读取它时,它可能会返回大量数据,因此另一种方法是用RETURN true替换该行,因为这是强制执行的全部操作matches成为数组,并且LENGTH大于0。

© www.soinside.com 2019 - 2024. All rights reserved.