#indexing #nosql #arangodb
#индексирование #nosql #arangodb
Вопрос:
У меня есть коллекция игроков в бейсбол, которая структурирована примерно следующим образом:
{
"name": "john doe",
"education": [
"Community College",
"University"
]
}
Если я хочу получить список всех школ в массивах образования, я могу сделать что-то вроде следующего:
FOR school IN unique((
FOR player IN players
COLLECT schools = player.education
RETURN schools
)[**])
FILTER school != null
FILTER LOWER(school) LIKE CONCAT('%', @name, '%')
LIMIT 10
RETURN school
Но для этого он должен касаться каждого документа в коллекции. Я создал индекс для players.education[*], в котором были бы все школы. Есть ли какой-либо способ, которым я мог бы напрямую запрашивать индекс для ключей (названий школ) вместо того, чтобы касаться каждой записи в коллекции каждый раз, когда мне нужно выполнить запрос?
Ответ №1:
Следует учитывать две вещи:
- Для
FILTER school != null
инструкции требуется не разреженный хэш-индекс (при разреженной индексации исключаютсяnull
значения) - Использование
LOWER(school)
иLIKE
всегда будет касаться каждого документа — никакой индекс не поможет (он должен получить доступ к документу, чтобы получить значение, чтобы сделать его строчным и т. Д.)
Имейте в виду, что большинство индексов работают одним из двух способов («полнотекстовый» является выбросом):
- Точное совпадение («хэш»)
- числовые
gt
/lt
вычислительные («список пропусков»)
Чтобы выполнить то, что вам нужно, вам нужно создать индекс для строкового свойства, которое вы можете точно сопоставить (с учетом регистра). Если вы не можете надежно сопоставить регистр между значением вашего атрибута и строкой поиска, я бы рекомендовал либо преобразовать значение в документе, либо создать копию этого атрибута в нижнем регистре и проиндексировать его.
Вот документы ArangoDB, касающиеся типов индексов. В руководстве есть раздел, посвященный основам и использованию индекса, но мне больше нравятся HTTP docs.