OrientDB Embedded-List (из строки): запрос с подстановочными знаками

Я не могу выполнить запрос с подстановочными знаками для свойства встроенного списка вершины (или ребра).

Например: предположим, что у нас есть класс Person с многозначным свойством с именем Nicknames и один его экземпляр:

   {
        "@type": "d",
        "@rid": "#317:0",
        "@version": 1,
        "@class": "Person",
        "Nicknames": [
            "zito",
            "ziton",
            "zitoni"
        ]
   }

затем Select FROM Person WHERE Nicknames like "zit%" возвращает пустой набор результатов, а:

Select FROM Person WHERE Nicknames ="zito" правильно возвращает 1 элемент.

В поле Nicknames есть индекс NOTUNIQUE_HASH_INDEX.

Я пробовал много способов (содержит, индексный запрос...) безуспешно :(

Я, наверное, упускаю что-то основное.


person Niro    schedule 18.04.2017    source источник
comment
Какую версию ты используешь?   -  person gaber84    schedule 20.04.2017
comment
версия 2.2.17.   -  person Niro    schedule 20.04.2017


Ответы (2)


Я знаю, что это не идеальное решение, то, что я собираюсь написать, но, чтобы придерживаться вашего требования «запрос по подстановочному знаку», это единственный способ, который сработал для меня, поскольку AVK заявил, что лучше работать с индексом Lucene , но со стандартной реализацией я не смог заставить его работать, теперь вот что я сделал:

Используйте студию для создания функции javascript с двумя параметрами с именем «массив» и «правило», давайте назовем функцию «wildcardSearch».

пропустите этот код в теле функции (просто javascript измените его, если он не выполняет эту работу):

 for(i=0; i<array.length ; i++){
       rule= rule.split("*").join(".*");
       rule= rule.split("*").join(".*");
       rule= "^" + ruleValue + "$";
       var regex = new RegExp(rule);
       if (regex.test(array[i]))
       return true;
   }
return false;

Не забудьте сохранить функцию

теперь вы можете запросить:

Select from Person where wildcardSearch(nicknames,'zit*')=true

СООБРАЖЕНИЯ: это метод грубой силы, но покажите, как «забавно» можно поиграть с «хранимой процедурой» в OrientDb, поэтому я все равно решил поделиться им, если производительность является вашей главной целью, это не для вас, это просканируйте весь класс и выполните цикл в массиве, чтобы применить регулярное выражение. Индекс - это лучшее решение или измените свою базу данных с другой структурой данных.

person gaber84    schedule 21.04.2017
comment
Если другого варианта не предложат (может быть, участниками проекта...), то воспользуюсь этим направлением. Спасибо - person Niro; 23.04.2017

Вы можете попробовать это:

select from Person where Nicknames containstext 'zit'

надеюсь, это поможет

person AVK    schedule 19.04.2017
comment
containstext хорош, но он не позволяет мне использовать подстановочные знаки, что является важной функцией для моих нужд (начинается с, заканчивается с...) - person Niro; 19.04.2017
comment
@Niro, вы могли бы вместо этого попробовать использовать индексацию lucene, но она немного ограничена - person AVK; 20.04.2017