2016-04-05 6 views
0

DSE solrを使用して、UDTのコレクションを含むcassandraテーブルのインデックスを作成しています。これらのUDT内の値に基づいて検索結果を並べ替えることができるようにしたい。サブ文書コレクションの値によるsolr応答のソート

単純な例テーブルを考えると

...

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

...と私はdsetool経由で自動生成Solrのスキーマだと仮定すると、私は学生に見つけたSolrのクエリを書くことができるようにしたいです(特定のtest_nameで)テストを行い、そのテストのスコア(またはパーセンタイルなど)でソートします。

+0

を、私はこれをやって試してみました: は選択のq = studends.test_scores?{タプル!}: "いくつかのテストは" %20_val_:test_scores.percentile&ソート=スコアを と私はこのエラーを取得する: 「MSG」:「子問合せは唯一の非親ドキュメントを一致させる必要がありますが、親DOCID = 2280392マッチchildScorer =クラスorg.apache.lucene.search.DisjunctionSumScorer」、 「トレース」: "java.lang.IllegalStateException:子クエリは、親ではないドキュメントと一致する必要がありますが、親のdocID = 2280392と一致するchildScorer =クラス ...しかし、私はそれで何をするか分からない。 –

答えて

0

あなたがすることができます」 UDTフィールドでソートします。

しかし、私はUDTの価値がここにあるのか分かりません。おそらく私はあなたのユースケースについて十分に知りません。私が見るもう1つの問題は、各パーティションキーが学生IDなので、1人の学生につき1つのテスト結果しか保存できないということです。テストIDをクラスタリング列として使用することで、学生のすべてのテスト結果を単一のパーティションに格納できるようにする方がよいでしょう。このような何か:

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

学生の名前は冗長の種類(それは各パーティション内のすべての行に対して同じであるべき)であるが、それは、クラスタリング列である必要はありません。

次に、あなたがそうのような任意のフィールドで並べ替えることができます。solr_query = '{: "TEST_NAME:生物学"、 "ソート": "Q" "パーセンタイルDESC"}' 学生FROM

SELECT * LIMIT 10;

私はJSONの構文は、ここで説明し使用してきた

https://docs.datastax.com/en/datastax_enterprise/4.8/datastax_enterprise/srch/srchJSON.html

0

あなたは基本的にJOINテーブルtest_scoreと学生の間にしたいですか?

公式ドキュメントによると:残念ながらhttp://docs.datastax.com/en/datastax_enterprise/4.8/datastax_enterprise/srch/srchQueryJoin.html

Solrのコアに参加すると、2つのテーブルはあなたの例ではそうではありません同じパーティションキーを、共有している場合にのみ可能です...

+0

いいえ、ここには「students」という表が1つしかありません.dsetoolはsolrコアを1つ作成します。 編集:私はスキーマを変更することを提案していない限り...? –

+0

申し訳ありませんが、それは私の悪いですが、私は誤ってCQLステートメント、test_scoreは、テーブルではなくタイプです。 – doanduyhai

関連する問題