コアの結合

検索ドキュメントを結合するための要件。

DSE Searchでは、1つのカスタム実装によるOS Solrクエリー時結合をサポートしています。異なる検索インデックスを保持するドキュメントを含む、複数の検索ドキュメントを以下の条件下で結合できます。
  • 検索インデックスは、同じキースペースと同じデータベース・パーティション・キーを持っている必要がある。
  • 結合する検索インデックスをサポートするテーブルがどちらもCQL互換である必要がある。
  • ユニーク・キー(パーティション・キーのデータベース・キー・バリデーター)のタイプが両方の検索ドキュメントで同じである。
  • テーブル・パーティション・キーとスキーマのユニーク・キーの順序が両方の検索ドキュメントで同じである。

簡略化された構文を使用すると、自動的に結合が使用されます。

簡略化された構文

DataStaxでは、検索インデックスの結合には簡略化された以下の構文の使用を推奨しています。

q={!join fromIndex=test.from}field:value

DSE Searchのカスタム実装では、OS Apache Solrで必要なto/fromパラメーターは使用しません。キー構造に基づいて、DSE Searchによってパラメーターが決定されます。アプリケーションとの後方互換性を確保するため、詳細なレガシー構文もサポートされています。

クエリー時結合の使用例

この例では2つのテーブルが作成されます。
  • songsテーブルでは、songのUUIDを1つの単純なプライマリ・キーとして使用します。
  • songsテーブルのプライマリ・キーは、そのパーティション・キーです。
  • lyricsテーブルでは、idとsongを複合プライマリとして使用します。どちらもタイプはUUIDです。
  • どちらのテーブルも、同じパーティション・キーを使用します。
検索インデックスを結合した後、歌詞(lyrics)に"love"を含む歌(songs)に関する情報を取得する1つのクエリーを作成します。
検索インデックスを結合するには:
  1. ファイルをダウンロードして解凍します

    このアクションにより、songsテーブルとlyricsテーブルのデータのインデックスを作成するための/songsディレクトリーと/lyricsディレクトリー、スキーマ、および構成ファイルが作成されます。

  2. cqlshを起動し、internetという名前のキースペースを作成して使用します。

    ダウンロードしたcommands.txtファイルからコピーできます。

  3. internetキースペースを共有し、同じパーティション・キーを使用する2つのテーブル、songとlyricsを作成します。
    cqlsh> CREATE TABLE songs (song uuid PRIMARY KEY, title text, artist text);
    cqlsh> CREATE TABLE lyrics (song uuid, id uuid, words text, PRIMARY KEY (song, id));

    両方のテーブルで、songパーティション・キーであるuuidを共有します。2番目のテーブルには、idクラスター化カラムもあります。

  4. データをダウンロードしたファイルからsongsテーブルにコピーします。
  5. データをlyricsテーブルに挿入します。

    Big DataとJohn Cedrickによる歌の歌詞は、愛について書かれています。

  6. ステップ1で作成したsongsディレクトリーに移動し、schema.xmlを確認します。lyricsディレクトリーにナビゲートし、スキーマを調べてみます。スキーマのユニーク・キーとlyricsテーブルのパーティション・キーの順序が(song, id)になっていて同じであることに注意してください。(id, song)を使用したのでは、うまくいきません。
    <schema name="songs_schema" version="1.5">
      <types>
         <fieldType name="uuid" class="solr.UUIDField" />
         <fieldType name="text" class="solr.TextField">
         <analyzer>
           <tokenizer class="solr.StandardTokenizerFactory"/>
         </analyzer>
         </fieldType>
      </types>
      <fields>
        <field name="song" type="uuid" indexed="true" stored="true"/>
        <field name="title" type="text" indexed="true" stored="true"/>
        <field name="artist" type="text" indexed="true" stored="true"/>
      </fields>
      <defaultSearchField>artist</defaultSearchField>
      <uniqueKey>song</uniqueKey>
    </schema>
       
    <schema name="lyrics_schema" version="1.5">
      <types>
        <fieldType name="uuid" class="solr.UUIDField" />
        <fieldType name="text" class="solr.TextField" >
        <analyzer>
          <tokenizer class="solr.StandardTokenizerFactory"/>
        </analyzer>
       </fieldType>
      </types>
        <fields>
          <field name="song" type="uuid" indexed="true" stored="true"/>
          <field name="id" type="uuid" indexed="true" stored="true"/>
          <field name="words" type="text" indexed="true" stored="true"/>
        </fields>
      <defaultSearchField>words</defaultSearchField>
      <uniqueKey>(song, id)</uniqueKey>
    </schema>
  7. songsディレクトリーで、internet.songsテーブル用の検索インデックス構成とスキーマを作成します。
  8. lyricsディレクトリーに、internet.lyricsコア用の検索インデックス構成とスキーマを作成し、internet.lyrics用の検索コアを作成します。
  9. 愛に関する歌詞が含まれる歌を検索します。
    http://localhost:8983/solr/internet.songs/select/?q={!join+fromIndex=internet.lyrics}words:love&indent=true&wt=json

    出力には、歌詞に"love"という単語を含む歌が2曲含まれています。1曲はBig Data、もう1曲はJohn Cedrickの歌です。

    "response":{"numFound":2,"start":0,"docs":[
         {
           "song":"a3e64f8f-bd44-4f28-b8d9-6938726e34d4",
           "title":"Dangerous",
           "artist":"Big Data"},
         {
           "song":"8a172618-b121-4136-bb10-f665cfc469eb",
           "title":"Internet Love Song",
           "artist":"John Cedrick"}]
    }}

再帰結合のサポート

結合クエリーをネストして、1つの結合の結果を別の結合の入力として使用し、さらにその結果を再帰的に使用できます。結合されたデータはすべて、同じパーティションに存在しなければなりません。1件のクエリーを別のクエリー文字列に埋め込むには、マジック・フィールド名_query_を使用します。

検索インデックスを再帰的に結合するクエリーを作成するには、以下の構文を使用します。

F1:V1 AND _query_:"{!join fromIndex=keyspace.table}(F2:V2 AND _query_:\"{!join fromIndex=keyspace.table}(F3:V3)\")"

ここで、クエリーからの最上位レベルには、ネストされた結合クエリーが含まれます。この例でのネストされた結合は、以下のとおりです。

_query_:\"{!join fromIndex=keyspace.table}(F3:V3)\"

SQL SELECT IN ...(SELECT IN ...)クエリーと同様に、ネストされた結合クエリーが最初に実行されます。その際、必要に応じて、複数のネストされた結合クエリーが有効になります。

注: 再帰的結合クエリーは、ネストされた結合クエリーの値が結果として返される関係結合ではありません。

再帰的結合クエリーの例

この例は、Solrクエリー時結合の例をベースにしています。"love"という単語を含む歌詞と歌を結合するクエリーに、AND _query_:"award:true"を使用して、受賞ビデオを結合する別のクエリーを埋め込みます。

ダウンロードしたcommands.txtファイルから、CQLコマンド、Solr HTTP要求、およびクエリーをコピーできます。
  1. cqlshで、internetキースペースを共有し、songsテーブルおよびlyricsテーブルと同じパーティション・キーを使用するvideosテーブルを作成します。
    cqlsh> CREATE TABLE videos (song uuid, award boolean, title text, PRIMARY KEY (song));

    3つのテーブル(songs、lyrics、videos)のすべてで、songパーティション・キーであるuuidを使用します。

  2. データをダウンロードしたファイルからvideosテーブルに挿入します。ビデオ・データにより、Big DataとBrad Paisleyによる歌を特集したビデオのawardフィールドがtrueに設定されます。
  3. ダウンロードしたファイルを解凍したときに作成されたvideosディレクトリーにナビゲートします。
  4. videosディレクトリーに、solrconfig.xmlschema.xmlを送信し、internet.videosの検索コアを作成します。
  5. ネストされた結合クエリーを使用して、songsドキュメントとlyricsドキュメントをvideosドキュメントに再帰的に結合し、愛について歌いかつビデオ・アワードを受賞した歌を選択します。
    http://localhost:8983/solr/internet.songs/select/?q=
             {!join+fromIndex=internet.lyrics}words:love AND _query_:
             {!join+fromIndex=internet.videos}award:true&indent=true&wt=json

    出力は以下のようになります。

    "response":{"numFound":1,"start":0,"docs":[
        {
          "song":"a3e64f8f-bd44-4f28-b8d9-6938726e34d4",
          "title":"Dangerous",
          "artist":"Big Data"}]
    }}

レガシー結合クエリーのサポート

DataStax Enterpriseでは、クエリーにtoフィールドとfromフィールドを含むレガシー構文の使用をサポートしています。レガシー構文を使用するための要件は、以下のとおりです。

  • テーブルで複合パーティション・キーが使用されていない。
  • mykeyspaceにあるmytable1とmytable2を結合する以下の例に示されているとおり、クエリーにforce=trueローカル・パーサー・パラメーターが含まれている。

レガシー構文の例

curl 'http://localhost:8983/solr/mykeyspace.mytable1/select/?q=\{!join+from=id+to=id+fromIndex=mykeyspace.mytable2+force=true\}'