MarkLogic Column多段な検索
はじめに
本稿では、MarkLogicに格納されているデータに対して、XQueryによる多段な検索方法の例をご紹介します。
多段な検索について
リレーショナルデータベースでは、SQLのJOIN句を使用したテーブルの結合が使われます。一方でMarkLogicなどのNoSQLデータベースにはテーブルという概念はありません。問い合わせ言語であるXQueryにおいてもSQLのJOIN句に該当するものがないため、データを結合する場合は数回の検索を行って結合する処理を組み立てる必要があります。
ここでは、XQueryでデータを結合する方法を紹介します。
検索例の概要
検索の例とする内容は以下になります。
- 店舗名"店舗A"を検索キーワードとして店舗情報を検索し、抽出した店舗IDに紐づく商品情報を検索して、店舗名・店舗ID・商品名・金額を表示する。
XQueryの処理は以下のような考え方になります。
- 1. 店舗情報データに対して、店舗名”店舗A"で検索を行い、店舗情報を取得する。
- 2. 商品情報データに対して、上記1で取得した店舗IDに一致するデータを検索する。
- 3. 上記1と2で取得した店舗情報と、商品情報を結果として表示する。
検索処理のイメージ

サンプルデータ構成
店舗情報のXMLデータ
店舗情報データ:「StoreName要素の値が"店舗A"」
商品情報のXMLデータ
店舗A(StoreCode要素の値が"T123456789")の商品として2件追加します。
商品情報データ1:「JANName要素の値が"炭酸A ペットボトル"」
商品情報データ2:「JANName要素の値が"お茶A ペットボトル"」
このほか抽出対象外のデータとして、店舗Bの店舗情報1件と商品情報1件を追加します。
検索の方法
1.データ登録
店舗情報のデータ、店舗A(/shop/dataA.xml)と店舗B(/shop/dataB.xml)の2件を登録します。以下のXQueryをクエリコンソールで実行します。
商品情報のデータ、店舗Aの商品情報2件(/JAN/data1.xml、/JAN/data2.xml)と店舗Bの商品情報1件(/JAN/data3.xml)の合計3件を登録します。 以下のXQueryをクエリコンソールで実行します。
クエリコンソール上でデータを登録した結果は以下になります。
店舗情報2件と商品情報3件の合計5件のデータが格納されたことを確認します。

2.検索の実施
実際に検索するXQueryの例を以下に示します。
出力する項目は、店舗情報の店舗名・商品情報の店舗ID・商品情報の商品名・商品情報の金額の4項目を表示します。今回は、検索にcts:search関数、データの絞り込みにcts:directory-query関数、条件の一致にcts:element-value-query関数を使用します。
3.実行結果の確認
商品情報データ3件のうち、店舗Aの店舗IDに一致する商品情報が2件出力されます。
クエリコンソール上で実行した結果は以下となります。

まとめ
本稿の内容をまとめます。
- XQueryは、SQLのJOIN句のようなデータの結合をサポートしていません。
- 本稿では、検索関数やFLOWR構文を利用してXQueryでも記述次第でデータの結合ができることを紹介しました。
今回使用した関数の他に、cts:uris関数による検索、コレクションを使用してcts:collection-query関数でデータを絞る方法などがありますので、ユースケースに合わせて実装することをおすすめします。