OrientDB Embedded-List(String):通配符查询

时间:2017-04-18 16:16:39

标签: orientdb orientdb2.2

我无法对顶点(或边)的嵌入列表属性执行通配符查询。

例如: 假设我们有一个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项。

字段NOTUNIQUE_HASH_INDEX上有Nicknames个索引。

我尝试了许多方法(包含,索引查询......)但没有运气:(

我可能遗漏了一些基本的东西。

2 个答案:

答案 0 :(得分:1)

我知道这不是一个理想的解决方案,我将会写,但是,要坚持你的要求"通过通配符"这是对我有用的唯一方法,因为AVK表示使用Lucene索引更好的工作,但是标准实现我无法让它工作,现在我已经完成了:

使用studio创建一个带有2个参数的javascript函数,名称为" array"和" rule",让我们命名函数" 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

注意事项:是一种蛮力方法,但要说明如何有趣&#34;可以使用&#34;存储过程&#34;在OrientDb中,所以无论如何我决定分享它,如果性能是你的主要目标,这不是适合你的,它会扫描所有类并在数组上执行循环以应用正则表达式。索引是一种更好的解决方案,或者使用不同的数据结构更改数据库。

答案 1 :(得分:0)

你可以试试这个:

select from Person where Nicknames containstext 'zit'

希望有所帮助