私たちのデータベースには、ドキュメント間の関係を含む、多くのメタデータを含むドキュメントが含まれています。架空の例:
<document>
<metadata>
<document-number>ID 12345 : 2012</document-number>
<publication-year>2012</publication-year>
<cross-reference>ID 67890 : 1995</cross-reference>
<cross-reference>ID 67890 : 1998</cross-reference>
<cross-reference>ID 67891 : 2000</cross-reference>
<cross-reference>ID 12345 : 2004</cross-reference>
<supersedes>ID 12345 : 2004</supersedes>
...
</metadata>
</document>
<document>
<metadata>
<document-number>ID 12345 : 2004</document-number>
<publication-year>2004</publication-year>
<cross-reference>ID 67890 : 1995</cross-reference>
<cross-reference>ID 67890 : 1998</cross-reference>
<cross-reference>ID 67891 : 2000</cross-reference>
<cross-reference>ID 12345 : 2012</cross-reference>
<cross-reference>ID 12345 : 2001</cross-reference>
<superseded-by>ID 12345 : 2012</superseded-by>
<supersedes>ID 12345 : 2001</supersedes>
...
</metadata>
</document>
ユーザーがこれらのドキュメントを検索できるようにするために、Marklogic 検索 API に基づく 1 ボックス検索を使用しています。検索文法はさまざまな制約と検索オプションを記述しますが、ほとんどの場合 (そしてデフォルトでは)、メタデータ要素のほとんどを含むように定義されたフィールドで検索し、(ある程度) 慎重に選択された重みを使用します (ここで本当に重要なdocument-number
のは、重さ。)
問題は、ビジネスが非常に具体的な結果の順序付けを望んでいることであり、検索 API を使用してそれを実現する方法が思い浮かびません。
問題を引き起こしている要件は、ユーザー検索が文書番号に一致する場合 (たとえば、「12345」を検索する場合)、その文書番号を持つすべての文書が結果セットの一番上にあり、日付の降順に並べられる必要があることです。それらを結果セットの一番上に置くのは簡単です。document-number
の重みが最も高いため、スコアによる並べ替えは正常に機能します。問題は、すべてのdocument-number
一致が他のドキュメントよりも高いスコアを持っていても、同じスコアを持っていないため、日付による 2 番目の並べ替えが機能しないことです。したがって、検索語が残りのドキュメントに表示される頻度で並べ替えられます。メタデータの; これはまったく意味がありません。
私たちが本当に必要としているのは、ドキュメント内の他の一致を参照せずに、検索用語に一致する最も重みの高い要素によって検索 API スコア結果を取得する方法です。私はスコアリングアルゴリズムを見てきましたが、それを行うものは見当たりません。私は何かを逃しましたか、それともこれは不可能ですか?score
明らかに、注文する必要はありません。ドキュメント内の単一の最適一致のスコアを取得し、それを並べ替えに使用する他の方法があれば、それで問題ありません。
私が考えもしなかった他の解決策はありますか?
2 つの検索 (document-number
メタデータ ツリー全体に対して 1 つと、メタデータ ツリー全体に対して 1 つ) を実行し、結果を結合することを考えましたが、ページネーションとパフォーマンスに大きな問題が生じるようです。そもそも検索APIを使用する目的に反するものはどれですか。
これらの他の一致を結果セットに含めるのは正しいことを付け加えておく必要があるため、 だけを検索することはできませんdocument-number
。