2016-04-20 7 views
2

Ich habe Firmen Vertices in meiner OrientDB mit Eigenschaft Name, der den Namen der Firma darstellt.Funktionsindex in OrientDB

Ich muss Daten in diesen Scheitelpunkten nach Eigenschaft Name nach Algorithmus suchen. Zum Beispiel muss ich alle Symbole in Low-Case konvertieren, alle Leerzeichen entfernen und einige spezielle Symbole entfernen.

In Postgresql würde ich Funktionsindex mit Funktion erstellen, die diesen Algorithmus implementiert. Aber das Problem ist, dass die Geschwindigkeit eines solchen Funktionsindex mich nicht befriedigen konnte (in der Tabelle mit 20 Millionen Datensätze benötigt der Datensatz für die Suche nach diesem Index etwa 1 Sekunde).

Wie kann ich einen solchen Algorithmus in OrientDB implementieren und wie effizient?

Antwort

0

benutzte ich dieses einfache Daten-Set Ihren Fall zu versuchen:

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' 

1. Suche Eckpunkte durch einen definierten Algorithmus:

die Ergebnisse abzurufen Sie suchen, Sie implementieren können, Abfrage mit OrientSQL methods wie .toLowerCase() und LIKE Operator. ZB:

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

    ----+------+--------- 
    # |@CLASS|Name 
    ----+------+--------- 
    0 |null |Company 1 
    ----+------+--------- 

Sie können auch eine Funktion enthalten, Ihre Abfrage erstellen:

enter image description here

2. Über den Index Wahl, ein HASH_INDEX (I verwendet ein NOTUNIQUE_HASH_INDEX) wäre besser, weil es ist praktischer auf großen Zahlen (wie in Ihrem Fall) und es hat viele Vorteile wie erklärt here

EDITED

ich diese Funktion erstellt ein Beispiel (inputName Parameter ist die Firma Name Sie suchen) geben:

enter image description here

Sobald die Funktion erstellt wurde, können Sie es durch anrufen mit dem OSQL:

STUDIO:

enter image description here

KONSOLE:

SELECT EXPAND(myFunction3('company1')) 

----+-----+---------+--------- 
# |@RID |@CLASS |Name 
----+-----+---------+--------- 
0 |#12:0|Companies|Company 1 
----+-----+---------+--------- 

1 item(s) found. Query executed in 0.015 sec(s). 

Über die Leistung, ich weiß nicht, die Komplexität des Datensatzes (z Anzahl und Art der Felder) und es ist schwer zu sagen. Sie könnten diese Beispiele als Ausgangspunkt für die Erstellung vieler und komplexerer benutzerdefinierter Funktionen verwenden.

Ich hoffe, es hilft.

+0

Danke hilft, aber ich habe mehr ausgeklügelten Algorithmus für die Suche erstellen (nicht nur in Kleinbuchstaben umwandeln, sondern auch Räume entfernen und einige spezielle Symbole und Sätze). Kann ich solche Dinge tun? –

+0

Hallo @Alex, Antwort bearbeitet. – LucaS

+0

Hallo @Lucas, danke, aber das Problem ist, dass ich genug Datensätze in der Klasse Unternehmen (ca. 21+ Millionen) habe. Die Abfrage (wählen Sie aus Firmen) funktioniert nicht für mich wegen Speichermangel ("java.lang.OutOfMemoryError: Java-Heap-Speicher") und es wird erwartet. Dieser Fall, fragte ich, kann ich Funktionsindex oder etwas Ähnliches auf meiner Klasse Unternehmen hinzufügen, um darin durch meinen Algorithmus (das Bilden von Kleinbuchstaben und das Entfernen von Leerzeichen) schnell genug zu suchen? –

1

Um Leerzeichen zu entfernen versuchen, diese JS-Funktion:

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; 

Vor

enter image description here

Nach

enter image description here

Hoffe, es

Grüße

+0

Hallo Michela! Vielleicht habe ich Sie falsch verstanden, aber Sie schlagen vor, dass ich dauerhaft Leerzeichen von Name-Eigenschaft entferne. Aber ich suche nicht danach. –

+0

Hi @Alex meine Funktion entfernt die Leerzeichen nicht dauerhaft, denn wenn ich eine Auswahl in meine DB mache, sehe ich keine Änderungen. –

+0

Pls machen mich ein bisschen klar, hiow ich kann deine Funktion nutzen? Bitte geben Sie mir ein Beispiel für die Abfrage mit Ihrer Funktion. Und noch ein Punkt. Ich habe mehr als 20 Millionen Datensätze in meiner Vertex-Klasse. Wie effizient wäre diese Funktion bei so vielen Daten? Danke/ –