OrientDB中的函数索引

OrientDB中的函数索引,orientdb,Orientdb,我的OrientDB中有代表公司名称的属性名称的公司顶点 我需要通过特殊算法按属性名称搜索这些顶点中的数据。例如,我必须将所有符号转换为小写,删除所有空格并删除一些特殊符号 在Postgresql中,我将使用实现该算法的函数创建函数索引。但问题是,在有2000万条记录的表中,这样的函数索引的速度并不能满足我的要求,用这个索引搜索记录大约需要1秒 我如何在OrientDB中实现这种算法,以及它的效率如何?我使用这个简单的数据集来尝试您的案例: CREATE CLASS Companies EXTE

我的OrientDB中有代表公司名称的属性名称的公司顶点

我需要通过特殊算法按属性名称搜索这些顶点中的数据。例如,我必须将所有符号转换为小写,删除所有空格并删除一些特殊符号

在Postgresql中,我将使用实现该算法的函数创建函数索引。但问题是,在有2000万条记录的表中,这样的函数索引的速度并不能满足我的要求,用这个索引搜索记录大约需要1秒


我如何在OrientDB中实现这种算法,以及它的效率如何?

我使用这个简单的数据集来尝试您的案例:

CREATE CLASS Companies EXTENDS V

CREATE PROPERTY Companies.Name STRING

CREATE INDEX Companies.Name ON Companies(Name) NOTUNIQUE_HASH_INDEX

CREATE VERTEX Companies SET Name = 'Company 1'
CREATE VERTEX Companies SET Name = 'Company 2'
CREATE VERTEX Companies SET Name = 'Company 3'
CREATE VERTEX Companies SET Name = 'Company 4'
CREATE VERTEX Companies SET Name = 'Company 5'
CREATE VERTEX Companies SET Name = 'Company 6'
一,。通过定义的算法搜索顶点:

要检索要查找的结果,可以使用like.toLowerCase和like运算符实现查询。例如:

    SELECT Name FROM Companies WHERE Name.toLowerCase() LIKE 'comp%1'

    ----+------+---------
    #   |@CLASS|Name
    ----+------+---------
    0   |null  |Company 1
    ----+------+---------
您还可以创建包含查询的函数:

二,。关于索引的选择,我使用的HASH_索引和NOTUNIQUE_HASH_索引会更好,因为它对像您这样的大数字更实用,而且它有很多优点

编辑

我创建此函数是为了给出一个示例inputName参数,该参数是您要查找的公司名称:

创建函数后,可以使用OSQL调用它:

演播室:

控制台:

关于性能,我不知道数据集的复杂性,例如字段的数量和类型,很难说。您可以测试并使用这些示例作为起点来创建许多更复杂的自定义函数


希望有帮助。

要删除空格,请尝试以下JS功能:

var g=orient.getGraph();
var c=g.command('sql','select from Companies');
var b=g.command("sql","select Name.indexOf(' ') from Companies");
var no_space=[];

for(i=0;i<c.length;i++)
{
  if(b[i].getProperty("Name")>-1)
  {
    var company=c[i].getProperty("Name").substring(0,b[i].getProperty("Name"));
    company+=c[i].getProperty("Name").substring(b[i].getProperty("Name")+1,c[i].length);
    no_space.push(company);
  }
}

return no_space;
以前

之后

希望能有帮助


关于

谢谢,但我必须创建更复杂的搜索算法,不仅要转换为小写,还要删除空格和一些特殊符号和短语。我能做这样的事情吗?嗨,卢卡斯,谢谢你,但问题是我在一流公司有足够多的唱片,大约有2100多万张。由于内存不足错误java.lang.OutOfMemoryError:java堆空间,所以查询select from COMPANYS不适用于我。在这个案例中,我问,我可以在我的类公司中添加函数索引或类似的东西,以便通过我的算法进行搜索,使lowcase和删除空格的速度足够快吗?@AlexZhulin我认为你不能用索引做你所要求的。可以增加指定给Orient的内存。您可以使用javascript函数删除名称中的所有空格、所有特殊符号,并将所有符号转换为小写,然后进行搜索。@Alessandrororota您能估计我的任务场景吗?1.我将向我的类NormalizedName添加额外属性。2.无论如何,我会在我的班级记录中填写这个属性。3.在插入或更新操作中,我将添加钩子,它将填充或更新属性NormalizedName。你怎么认为?这是一个好的场景还是存在更好的场景?嗨,米歇尔!也许我误解了您的意思,但您建议我永久删除Name属性中的空格。但这不是我想要的。嗨@Alex我的函数不会永久删除空格,因为如果我在数据库中进行选择,我看不到任何更改。请让我清楚一点,我如何使用你的函数?请给我一个查询你的功能的例子。还有一点。我的vertex类中有超过2000万条记录。对于如此大量的数据,此功能的效率如何?谢谢/Hi@Alex,关于@Michela Bonizzi的函数,它检索修改为小写且没有空格的公司名称,但更改是动态的,不是永久性的。显示的输出是临时的,因为它是一个简单的选择。如果您从公司启动新的SELECT,您将看到数据集没有更改。我使用它的逻辑创建了一个新函数,该函数允许将输入参数小写和不带空格与修改后的列表进行比较,以获得您想要的结果。希望能有所帮助。
var g=orient.getGraph();
var c=g.command('sql','select from Companies');
var b=g.command("sql","select Name.indexOf(' ') from Companies");
var no_space=[];

for(i=0;i<c.length;i++)
{
  if(b[i].getProperty("Name")>-1)
  {
    var company=c[i].getProperty("Name").substring(0,b[i].getProperty("Name"));
    company+=c[i].getProperty("Name").substring(b[i].getProperty("Name")+1,c[i].length);
    no_space.push(company);
  }
}

return no_space;