2009-07-29 55 views
17

'da parametreli bir sorguyu nasıl gerçekleştirebilirim Bazı verileri benim için saklamak için CouchDB'yi kullanmak istiyorum ve sonra ihtiyacım olan verileri almak için RESTful api çağrılarını kullanıyorum. Benim veritabanı "test" olarak adlandırılan ve belgelerim hepsi benzer bir yapıya sahip ve (hello_world belge kimliğidir) şuna benzer olduğunu: Ben yapabilmek istiyorum neCouchDB

"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} 
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"} 

benim kullanıcımız var olduğunu gibi bir sorgu gönderin: "Bana" Merhaba dünya "kelimelerini içeren tüm belgeleri verin, örneğin, görüntülerle uğraştım ama bu değerlerin yalnızca birine veya daha fazlasına taşınmamı sağlayacak gibi görünüyor. . harita fonksiyonunun "anahtar" bölümü Bu beni böyle bir şey yapmak olanağı verir:

http://localhost:5984/test/_design/search/_view/search_view?key= "merhaba"

Ancak, bu, kullanıcıların sorgu dizelerini belirtmelerine izin vermeme izin vermiyor. Örneğin, "merhaba dünya" için arama yaptıysa. İki soru sormak zorundayım: biri "merhaba" ve diğeri "dünya" için, sonuçları birleştirmek, kopyalar çıkarmak için bir sürü javascript yazmak zorundayım (YUCK!).

http://localhost:5984/test/_design/search/_view/search_view?term= "merhaba dünya"

Sonra/görünümler haritasında parametresini "merhaba dünya" kullanan tüm bulmak için fonksiyonlarını azaltmak: Ne istiyorum gerçekten böyle bir şey yapmak mümkün değildir etiketler dizisinde hem "merhaba" hem de "dünya" içeren belgeler. CouchDB ile bu tür bir şey mümkün mü? Bunu, düşünmediğim bir görüş içinde gerçekleştirmenin başka bir yolu var mı?

cevap

19

CouchDB Görünümler yüzle ilgili arama veya tam metin arama veya sonuç kesişimini desteklemez. Couchdb-lucene eklentisi tüm bunları yapmanıza izin verir. Her belge için anahtar olarak belgenin etiketlerin POWERSET her kümesi yayarlar eğer

http://github.com/rnewson/couchdb-lucene/tree/master

+0

Örnek vermek ya da sunmak ister misiniz? –

+6

Projenin geliştiricilerinden biri - "Yapamazsın, ama bu proje sana izin verecek." Bu oldukça iyi bir cevap. – dnolen

2

Teknik olarak bu mümkün. Anahtar kümesi öğesi sipariş edilmeli ve sorgunuzda sipariş edilen etiketleri sorgulamak zorunda kalabilirsiniz. Bu yayarlar olur doc {"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} için

function map(doc) { 
    function powerset(array) { ... } 

    powerset_of_tags = powerset(doc.tags) 
    for(i in powerset_of_tags) { 
    emit(powerset_of_tags[i], doc); 
    } 
} 

: Bunun yerine arkward çözüm dikkate alacağını bu mümkün olsa

{ key: [], doc: ... } 
{ key: ['hello'], doc: ... } 
{ key: ['world'], doc: ... } 
{ key: ['hello', 'world'], doc: ... } 

. Daha fazla sayıda etiket için görünümün disk kullanımını hayal etmek istemiyorum. Yayılan anahtar sayısının 2^n gibi büyüyeceğini umuyorum.

+2

bu önerilmez. Performans büyük ölçüde acı çekecek ve endekslerin depolanmasının kontrol dışı kalacağını belirttiniz. Yukarıda bahsedilen couchdb-lucene istediğini yapmak için doğru yoldur. –