MarkLogicでのワイルドカード検索の仕組み
Posted by Mike Wooldridge on 02 May 2019 12:10 PM |
|||||||||||||
ワイルドカードは、クエリの中に含めることができる特殊な文字です。ワイルドカードを使用することで、特定のタームのバリエーションを検索できます。ワイルドカードを使えば、短い文字列で、スペルが似た語を効率よく検索して、データベース内でマッチするタームを多数見つけることができます。MarkLogicの検索では、次の2つのワイルドカード文字がサポートされています。
ワイルドカードは、検索タームの先頭、途中、または末尾で使用でき、それらを組み合わせることもできます(例: ワイルドカード検索に似た機能として、ステミング(語幹処理)があります。これは、MarkLogicでクエリを処理するときに、文法的に似た語を自動的に考慮する機能です。ステミングがオンのとき、MarkLogicで MarkLogicでは、次の3タイプのインデックスを使用したワイルドカード検索がサポートされています。
これらのインデックスがいつどのように使用されるかは、検索するワイルドカードのパターンによって変わります。 Three-Character Indexesインデックスは、MarkLogicの通常検索において重要であるだけでなく、ワイルドカードの処理においても重要な役割を果たします。インデックスは、データベースドキュメント内の文字シーケンスを取得して、それらをドキュメントIDにマッピングしたものです。MarkLogicによる一般的な検索では、クエリを分析して複雑なクエリを構成要素に分解してから、インデックスを参照してマッチする結果のリストを返しています。デフォルトでは、データベース内のすべての語と、要素名および属性名(XMLドキュメントの場合)やプロパティ名(JSONドキュメントの場合)などの構造情報に対してインデックスが付けられます。ワイルドカードなどの特定の機能をサポートするために、追加のシーケンスに対してMarkLogicにインデックスを付けさせることができます。 データベースでthree-character indexをオンにすると、MarkLogicによってすべての一意の3文字シーケンスが、対応するドキュメントにマッピングされます。例えば、 また、MarkLogicでは、three-character indexを活用してより長いワイルドカードタームを処理できます。 このような不適切な結果は、検索のフィルタリングの段階で削除します。フィルタリングでは、結果のドキュメントを開いて、それらのドキュメントが検索クエリに実際にマッチすることを再確認します。MarkLogicで実行されるフィルタリングが増えると、結果を返すまでにかかる時間が長くなります。したがって、フィルタリングに時間がかかる可能性がある長いワイルドカードタームをthree-character indexで処理するのは、必ずしも得策ではありません。(フィルタリングはオフにできます。これによって結果をより速く取得できますが、不適切な結果が含まれている可能性があります。) MarkLogicには、データベースの1文字インデックスおよび2文字インデックスをオンにするオプションもあります。より短いタームに対するワイルドカードの結果(例: 4文字以上のシーケンスに対するインデックスはどうなっているのでしょうか。MarkLogicでは、それらのインデックスは提供されていません。これは、多くの場合、それによって得られるメリットよりも、インデックススペースが増大するデメリットのほうが大きいからです。一般的に、労力に対する成果が最も大きいのがthree-character indexesで、これによってワイルドカードおよび検索全般を効率的にサポートできます。 Trailing Wildcard Index4つ以上の文字と末尾の*からなるワイルドカード検索をすばやく処理できるように、trailing wildcard indexをオンにすることができます。このインデックスでは、3文字以上のそれぞれの語に対して、プレフィックスのすべての可能な組み合わせがエントリとして保存されます。例えば、 Trailing wildcard indexは、タームの先頭に*が付いている場合(例: 図1:インデックスによって、ドキュメントに存在する文字シーケンスが、対応するドキュメントIDにマッピングされます。この図は、MarkLogicで複数のインデックスがオンになっている場合に、caterという語からシーケンスが保存される様子を示しています。 レキシコンMarkLogicでは、three-character文字列やtrailing wildcardよりも複雑な形のワイルドカード検索に対して、レキシコンの使用が試みられます。レキシコンは、データベース内の一意の語を列挙した順序付きリストです。インデックスとは異なり、レキシコンでは、語をその出現元のドキュメントにマッピングしていません。これは単なる大きな順序付きリストです。 MarkLogicはレキシコンを使用することで、ワイルドカードパターンにマッチする可能性があるすべてのものをすばやく取得できます。例えば、 この
その後、インデックスでこの3つの語の出現を検索し、見つかったものを1つの結果としてまとめることができます。 また、レキシコンでは検索ボックスでの入力候補表示もサポートされます。ユーザーが検索ボックスに「 レキシコンの制限レキシコンを使用して、 これに対処するために、3文字のプレフィックスおよびポストフィックスからなる短いリストを作成することで、返された大量のタームのリストを切り詰めることができます。 例えば、レキシコンの結果リストが次のようになったとします。
プレフィックス–とポストフィックスの方法を使用すれば、このリストを次のように書き換えて、より短く管理しやすいものにすることができます。
その後、これらの3文字シーケンスを使用して、高速に処理されるthree-character indexesを利用できます。これには不適切な結果が含まれている可能性があり、フィルタリングが必要になりますが、レキシコンをスキャンして返される語が多すぎる場合は、こちらのほうがよい方法になります。 MarkLogicは、
ワイルドカード検索のオプション開発者は、lexicon-expandオプションを使用して、MarkLogicでのレキシコンを使用したワイルドカード検索の解決方法を制御できます。このオプションには次の値を使用できます。
レキシコンスキャンにおける工夫 レキシコン内のエントリの順序は、レキシコンのコレーションタイプによって決まります。小文字が大文字より前に配列されるコードポイントレキシコンは、検索が早く、より正確な結果が得られるので推奨されます。ただし、大文字と小文字を区別しない検索に対して難点があります。例えば、レキシコンで MarkLogicでは、この問題を解決するために、最初に一連のバイナリ検索を行って、スキャンする必要があるレキシコンのセクションを絞り込みます。バイナリ検索では、順序付きリストの中央にある項目を見つけ、検索タームがその中央の項目の前にあるのか後ろにあるのかを調べ、その後、同様の検索を該当する半分に対して実行します。このように分割して絞り込んでいくことで、最後に目的のものにたどり着きます。通常はこのほうが、リニア検索で見つけるよりも早くなります。
図2:MarkLogicは、一連のバイナリ検索を使用して、レキシコン内でタームをスキャンする労力を最小化します。この例は、 まとめMarkLogicでは、非常に複雑なワイルドカードクエリにもすばやく結果を返すことができます。ワイルドカード検索の詳細、および関連設定の構成の詳細については、MarkLogicのマニュアルを参照してください。 この記事の執筆にあたって援助を提供してくれたMary HolstegeとFei Xueに感謝します。 The post MarkLogicでのワイルドカード検索の仕組み appeared first on MarkLogic. | |||||||||||||