Я исследую кластер ArangoDb и выяснил, что в случае использования двух запросов FULLTEXT () один из них задействует движок V8.Мои данные:
[
{
"TITL": "Attacks induced by bromocryptin in Parkinson patients",
"WORD": [
"hascites",
"Six patients with Parkinson's disease"
],
"ID":1,
},
{
"TITL": "Linear modeling of possible mechanisms for Parkinson tremor generation",
"WORD": [
"hascites",
"jsubsetIM"
],
"ID":2,
},
{
"TITL": "Drug-induced parkinsonism in the rat- a model for biochemical ...",
"WORD": [
"hascites",
"Following treatment with reserpine or alternatively with ...",
"hasabstract"
],
"ID":3,
}
]
Простейший запрос:
FOR title IN FULLTEXT(pmshort,"TITL","parkinson")
FOR word IN FULLTEXT(pmshort,"WORD","hascites")
FILTER title.ID==word.ID
RETURN title
Другими словами, я пытаюсь найти все документы, которые имеют parkinson
в TITL
и hascites
в WORD
.Этот пример серьезно упрощен, поэтому использование чего-то вроде
FILTER word.WORD=='hascites'
невозможно.Для обеспечения необходимой функциональности требуется два или более поиска FULLTEXT.Коллекция включает в себя около 520 000 документов.Полнотекстовые индексы устанавливаются для каждого поля.
Я обнаружил, что каждый из запросов FULLTEXT, выполняемый отдельно, включает в себя индекс:
Execution plan:
Id NodeType Site Est. Comment
1 SingletonNode DBS 1 * ROOT
5 IndexNode DBS 526577 - FOR title IN pmshort /* fulltext index scan */
8 RemoteNode COOR 526577 - REMOTE
9 GatherNode COOR 526577 - GATHER
4 ReturnNode COOR 526577 - RETURN title
Но в случае использования сначала FOR
один обрабатывается V8 (JavaScript) и выполняется на координаторе, а не на DBS:
Execution plan:
Id NodeType Site Est. Comment
1 SingletonNode COOR 1 * ROOT
2 CalculationNode COOR 1 - LET #2 = FULLTEXT(pmshort /* all collection documents */, "TITL", "parkinson") /* v8 expression */
3 EnumerateListNode COOR 100 - FOR title IN #2 /* list iteration */
10 ScatterNode COOR 100 - SCATTER
11 RemoteNode DBS 100 - REMOTE
9 IndexNode DBS 52657700 - FOR word IN pmshort /* fulltext index scan */
6 CalculationNode DBS 52657700 - LET #6 = (title.`ID` == word.`ID`) /* simple expression */ /* collections used: word : pmshort */
7 FilterNode DBS 52657700 - FILTER #6
12 RemoteNode COOR 52657700 - REMOTE
13 GatherNode COOR 52657700 - GATHER
8 ReturnNode COOR 52657700 - RETURN title
Конечно, это сильно замедляет работу системы.Итак, мои вопросы: 1. Почему кластер ArangoDb не может обрабатывать оба условия на DBS, а не на координаторе (COOR)?2. Как избежать такой ситуации, поскольку производительность падает в 300-500 раз?3. Может быть, кто-то может указать на некоторые дополнительные материалы, чтобы прочитать об этом.
Любая помощь приветствуется.Спасибо!