OrientDB嵌入列表(字符串):通配符查询

OrientDB嵌入列表(字符串):通配符查询,orientdb,orientdb2.2,Orientdb,Orientdb2.2,我无法对顶点(或边)的嵌入列表属性执行通配符查询 例如: 假设我们有一个名为昵称的多值属性的Person类和它的一个实例: { "@type": "d", "@rid": "#317:0", "@version": 1, "@class": "Person", "Nicknames": [ "zito", "ziton", "zitoni"

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

例如: 假设我们有一个名为
昵称
的多值属性的
Person
类和它的一个实例:

   {
        "@type": "d",
        "@rid": "#317:0",
        "@version": 1,
        "@class": "Person",
        "Nicknames": [
            "zito",
            "ziton",
            "zitoni"
        ]
   }
那么,
从昵称为“zit%”的人中选择
返回空结果集,而:

从昵称为“zito”的人员中选择。
正确返回1项

字段
昵称
上有一个
NOTUNIQUE\u HASH\u索引
索引

我尝试了很多方法(包含、索引查询…),但都没有成功:(

我可能缺少一些基本的东西。

您可以尝试以下方法:

select from Person where Nicknames containstext 'zit'

希望对我有所帮助

我知道这不是一个理想的解决方案我将要写的内容,但是,为了坚持你的“通配符查询”要求,这是唯一对我有效的方法,正如AVK所说,使用Lucene索引是一个更好的主意,但是使用标准实现我无法让它工作,现在我做了以下工作:

使用studio创建一个javascript函数,该函数有两个参数,分别名为“array”和“rule”,让我们将函数命名为“wildcardSearch”

在函数体中跳过此代码(只是简单的javascript,如果它不执行此任务,请更改它):


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

containstext
很好,但它不允许我使用通配符对于我的需求,这是一个重要的功能(开始于,结束于…)@Niro您可以尝试使用lucene索引,但有点限制您使用的是什么版本?版本2.2.17。如果没有其他建议(可能是项目的贡献者…),我将使用此方向。谢谢
 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