2016-04-05 28 views
0

UDT koleksiyonu içeren bir cassandra tablosunu indekslemek için DSE solr kullanıyorum. Arama sonuçlarını, bu UDT'lerin içindeki bir değere göre sıralayabilmek istiyorum. Bir basit örnek tablo göz önüne alındığında Subdocument koleksiyonuna göre solr cevabını sırala

...

create type test_score (
    test_name text, 
    percentile double, 
    score int, 
    description text 
); 

create table students (
    id int, 
    name text, 
    test_scores set<frozen<test_score>>, 
    ... 
); 

... ve dsetool aracılığıyla Solr şema otomatik olarak oluşturarak ediyorum varsayarak Öğrencilere kim bulan bir Solr sorgusu yazabilmek istiyorum bir testi (belirli bir test_adı ile) almış ve bunları testin skoruna göre (ya da yüzdelik ya da her neyse) sıralamıştır.

+0

denedim:

Burada anlatılan JSON sözdizimi kullandım? {Tanımlama grubu!}: "Bazı test" % 20_val_: test_scores.percentile & sort = skor , "iz" "çocuk sorgusu olmayan tek ebeveyn docs eşleşmesi gerekir, ancak ana docid = 2280392 eşleşti childScorer = sınıf org.apache.lucene.search.DisjunctionSumScorer": "msg": ve bu hatayı alıyorum: "java.lang.IllegalStateException: alt sorgu yalnızca ebeveyn olmayan dokümanlar ile eşleşmelidir, ancak parent docID = 2280392 eşleştirilmiş childScorer = sınıf ... ama bununla ne yapacağımı bilmiyorum. –

cevap

0

yapabilirsiniz' UDT alanlarına göre sıralama. Ancak, bir UDT'nin değerinin burada olduğundan emin değilim. Belki de kullanım durumunuz hakkında yeterli bilgiye sahip değilim. Gördüğüm başka bir konu, her bölüm anahtarının bir öğrenci kimliğidir. Bu nedenle, her bir öğrenci için bir test sonucunu saklayabilirsiniz. Daha iyi bir yaklaşım, test kimliğini bir küme sütunu olarak kullanmak olabilir, böylece bir öğrenci için tüm test sonuçlarını tek bir bölümde saklayabilirsiniz. Böyle bir şey:

CREATE TABLE students (
id int, 
student_name text, 
test_name text, 
score int, 
percentile double, 
description text, 
PRIMARY KEY (id, student_name, test_name) 
); 

Öğrenci adı yedekli türüdür (her bölüm her satır için aynı olmalıdır), ama bir kümelenme sütun olmak zorunda değildir.

Sonra şöyle herhangi bir alan üzerinde sıralayabilirsiniz:

SELECT * öğrencileri WHERE solr_query = '{ "q": "test_name: Biyoloji", "sıralama": "yüzdelik desc"}' SINIR 10; seçmek q = studends.test_scores: Bunu yaparken https://docs.datastax.com/en/datastax_enterprise/4.8/datastax_enterprise/srch/srchJSON.html

0

Tamamen temelde tablo test_score ve öğrenciler arasında bir JOIN yapmak ister misiniz?

resmi dokümana göre: Maalesef http://docs.datastax.com/en/datastax_enterprise/4.8/datastax_enterprise/srch/srchQueryJoin.html

Solr çekirdeğini Katılma 2 tablolar sizin örnekte durum böyle değil aynı bölüm anahtarını paylaşmak mümkün yalnızca ...

+0

Hayır, burada sadece bir masa var, 'öğrenciler' ve dsetool yalnızca bir solr çekirdeği oluşturur. DÜZENLEME: Şemayı değiştirdiğimi önermediğiniz sürece ...? –

+0

Üzgünüz, bu benim kötü, CQL ifadesini yanlış okuyorum, test_score bir tür değil, bir tablo. – doanduyhai