2017-02-06 4 views
1

Wir testen derzeit "Aerospike". Aber es gibt bestimmte Punkte in der Dokumentation, die wir nicht in Bezug auf die Schlüssel verstehen.Aerospike wo Abfrage-Index Python

key = ('trivium', 'profile', 'data') 
# Write a record 
client.put(key, { 
    'name': 'John Doe', 
    'bin_data': 'KIJSA9878MGU87', 
    'public_profile': True 
}) 

Wir lesen über den Namespace, aber wenn wir versuchen, mit der allgemeinen Dokumentation abzufragen.

client = aerospike.client(config).connect() 
     query = client.query('trivium', 'profile') 
     query.select('name', 'bin_data') 
     query.where(p.equals('public_profile', True)) 
     print(query.results()) 

Das Ergebnis ist null, aber wenn wir die „where“ Anweisung eerase die Abfrage alle Datensätze bringt, sagt die Dokumentation, dass die Abfrage der Arbeit mit dem sekundären Index, aber wie das funktioniert?

Grüße.

Antwort

2

Sie können einen Filter in einer Abfrage verwenden. Dieser Filter, in Ihrem Fall der Gleichheitsfilter, befindet sich in der Spalte public_profile. Um den Filter zu verwenden, müssen Sie einen sekundären Index (SI) in der public_profile-Bin erstellen, SIs können jedoch nur in Bins mit numerischem oder Zeichenfolgendatentyp sein. Um das zu tun, was Sie tun möchten, ändern Sie public_profile in einen numerischen Eintrag von 0 oder 1, fügen Sie dann einen sekundären Index für diesen Bin hinzu und verwenden Sie den Gleichheitsfilter für den Wert 0 oder 1. Während Sie mehrere SIs erstellen können kann nur einen Filter in einer beliebigen Abfrage aufrufen. Sie können mehrere Filter nicht mit einem UND verknüpfen. Wenn Sie mehrere Filter verwenden müssen, müssen Sie Stream UDFs (User Defined Functions) schreiben. Sie können AQL verwenden, um SIs zu definieren, Sie müssen es nur einmal tun.

$aql 
aql>help --- see the command to add secondary index. 
aql>exit 

SIs befinden sich im Prozess-RAM. Nach der Definition werden alle neuen Daten, die hinzugefügt oder geändert werden, automatisch von aerospike indiziert. Wenn Sie den Index für public_profile als NUMERIC definieren, aber in einigen Datensätzen Stringdaten in diesen Bin einfügen, werden diese Datensätze nicht indiziert und nehmen nicht am Abfragefilter teil.

+1

Danke für die vollständige Antwort, Sie haben Recht, ich dachte, dass Aerospike ist schnell, wir dachten, dass wir es für User Administrator verwenden können, aber scheint wie die Erstellung einer komplexen Abfrage ist es wichtig für das System. Wir werden jedoch eine andere Technik wie Mongo oder Cassandra versuchen. Vielen Dank, Grüße – UlyssesMarx

+0

Sicher, Sie sollten die Lösung verwenden, die am besten zu Ihrem Anwendungsfall passt. BTW, Stream UDFs sind ziemlich einfach zu schreiben. Hier ist ein kurzes Beispiel. https://discuss.aerospike.com/t/record-manipulation-with-more-than-one-filter-lua/3637 und Code ist hier: https://github.com/pygupta/aerospike-discuss/tree/ master/topic3637 – pgupta

+1

Aktualisierter GitHub-Link: https://github.com/pygupta/aerospike-discuss/tree/master/topic3637_streamUDF_multifilter – pgupta