Как искать нечувствительную к регистру подстроку в массиве объектов - PullRequest
0 голосов
/ 24 марта 2020

In ArangoDB Я играю с набором тестов, который представляет собой набор данных IMDB, загруженный с их сайта как csv. Документ с фильмами имеет следующую структуру:

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

При этом я могу сопоставлять всю строку только с учетом регистра: как искать подстроку без учета регистра?

Я не могу использовать полнотекстовый index, поскольку ArangoDB не поддерживает его в массивах, и я не могу использовать LOWER() и CONTAINS(), так как это массив.

Есть идеи?

Спасибо!

1 Ответ

0 голосов
/ 24 марта 2020

Вы можете вложить ваш поиск, давая вам возможность искать в массиве без применения ограничений, используя обозначение '[*]'.

Вот пример, который выполняет поиск внутри каждого освобождает массив, ищет нечувствительное к регистру совпадение, а затем возвращает, если получит какие-либо совпадения.

Функция FILTER будет возвращать mov ie, только если хотя бы один из выпусков имеет совпадение.

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.

...