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