2016-04-04 90 views
2

Bir kümede milyonlarca kayıt var. Aynı modelle eşleşen tüm kayıtları almak istiyorum.Aerospike'de bir regex ile eşleşen tüm kayıtlar nasıl alınır?

Mesela ben olabilir:

id=4444?mode=mode1?fieldA=abc 
id=4444?mode=mode1?fieldA=azerty 
id=4444?mode=mode1?fieldA=qwerty 
id=4444?mode=mode1?fieldA=foo 
id=4444?mode=mode1?fieldA=bar 

bir sorgu önceden fieldA değerini bilmeden her şeyden kayıtlara ulaşmak yapmak mümkün mü? Düzenli olarak böyle bir şey:

id=4444?mode=mode1?fieldA=[\w]* 

Zaman ayırdığınız için teşekkür ederiz.

+0

bu öneriyi Aerospike Forum'dan okuyabilirsiniz: https://discuss.aerospike.com/t/how-to-write-wildcard-seach-statement/385 – lvolmar

cevap

4

Evet, bu yapılabilir. İlk önce sonuç kümesini yönetilebilir bir boyuta daraltmak için ikincil bir indeksle sorgulamanız, ardından istemediğinizi filtreleyen Lua'yı kullanarak bir filtre yazmanız gerekir. Bu filtre eşleştirmek istediğiniz normal ifadeyi (dinamik olarak geçirilmiş) alabilir ve yalnızca eşleşen kayıtlara geri dönebilir.

Bu işe yararken, Aerospike'daki anahtar-değer operasyonları kadar verimli olmayacaktır. Üretime koymadan önce böyle bir çözümü kesinlikle değerlendirmek istersiniz.

1

Predicate filtering Böyle Bahsettiğiniz biri olarak karmaşık filtreler oluşturmak için Java istemci PredExp sınıfının stringRegex yöntemi kullanabilirsiniz 15 Mart'ta release 3.12 eklendi. Ayrıca şu anda C, C# ve Go istemcileri için de var.

Aerospike Java istemcisi bir similar example var:

Statement stmt = new Statement(); 
    stmt.setNamespace(params.namespace); 
    stmt.setSetName(params.set);   
    stmt.setFilter(Filter.range(binName, begin, end)); 
    stmt.setPredExp(
     PredExp.stringBin("bin3"), 
     PredExp.stringValue("prefix.*suffix"), 
     PredExp.stringRegex(RegexFlag.ICASE | RegexFlag.NEWLINE) 
     ); 

com.aerospike.client.query içinde RegexFlag sınıf kullanabileceğiniz düzenli hangi ifadeler tanımlar ve davranırlar ediyorum nasıl.