2016-04-05 8 views
0

Ich verwende DSE Solr, um eine Cassandra-Tabelle zu indizieren, die eine Sammlung von UDTs enthält. Ich möchte Suchergebnisse basierend auf einem Wert innerhalb dieser UDTs sortieren können.Sortieren von Solr-Antwort nach Wert in Filialdokumentsammlung

ein einfaches Beispiel Tabelle ...

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>>, 
    ... 
); 

... und unter der Annahme, ich bin das solr Schema über dsetool Auto-Generierung, ich möchte eine solr Abfrage schreiben können, die die Schüler findet habe einen Test (nach einem bestimmten test_name) genommen und nach dem Ergebnis des Tests (oder Perzentil oder was auch immer) sortiert.

+0

Ich habe dies zu tun versucht: wählen q = studends.test_scores {Tupel!}: "Einige Test" % 20_val_: test_scores.percentile & sort = Partitur und ich bekomme diese Fehlermeldung: "msg": "Kind Abfrage nur nicht-Mutter docs übereinstimmen müssen, aber Eltern docID = 2.280.392 angepasst childScorer = class org.apache.lucene.search.DisjunctionSumScorer", "Spur": "java.lang.IllegalStateException: Die untergeordnete Abfrage darf nur nicht übergeordnete Dokumente abgleichen, aber übergeordnete docID = 2280392 entspricht childScorer = Klasse ... aber ich weiß nicht, was ich damit machen soll. –

Antwort

0

Leider können Sie‘ t nach UDT-Feldern sortiert.

Allerdings bin ich mir nicht sicher, was der Wert eines UDT ist hier. Vielleicht weiß ich nicht genug über Ihren Anwendungsfall. Ein anderes Problem, das ich sehe, ist, dass jeder Partitionsschlüssel eine Studenten-ID ist, so dass Sie nur ein Testergebnis pro Schüler speichern können. Ein besserer Ansatz könnte darin bestehen, die Test-ID als Clusterspalte zu verwenden, damit Sie alle Testergebnisse für einen Studenten in einer einzigen Partition speichern können. Etwas wie folgt aus:

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

Studenten Name ist irgendwie überflüssig (es sollte das gleiche für jede Zeile in jeder Partition sein), aber es muss nicht ein Clustering Spalte sein.

Dann können Sie auf ein beliebiges Feld sortieren wie so:

SELECT * FROM Studenten WHERE solr_query = '{ "q": "Testname: Biologie", "Art": "Perzentil desc"}' LIMIT 10;

Ich habe die JSON-Syntax hier beschrieben verwendet: https://docs.datastax.com/en/datastax_enterprise/4.8/datastax_enterprise/srch/srchJSON.html

0

Ok also im Grunde wollen Sie eine JOIN zwischen Tabelle test_score und Studenten richtig machen?

Nach der offiziellen doc: http://docs.datastax.com/en/datastax_enterprise/4.8/datastax_enterprise/srch/srchQueryJoin.html

Joining Solr Kern ist nur möglich, wenn die zwei Tabellen die gleiche Partition Schlüssel teilen, was nicht der Fall in Ihrem Beispiel ist ...

+0

Nein, hier gibt es nur eine Tabelle, "Schüler", und das dsetool erstellt nur einen Solr-Kern. EDIT: Wenn Sie nicht vorschlagen, ändere ich das Schema ...? –

+0

Sorry, es ist mein Fehler, ich habe die CQL-Anweisung falsch gelesen, test_score ist ein Typ, keine Tabelle. – doanduyhai

Verwandte Themen