在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()
,因为它是一个数组。
有什么想法吗?
谢谢!
可以嵌套搜索,使您可以在数组中进行搜索,而不必使用'[*]'表示法来施加约束。
这里是一个在每个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。