以前のプロジェクトでLuceneを使用したことがあるので、APIについてはある程度慣れています。しかし、私は「ファンシー」なことをする必要はありませんでした(「ファンシー」とは、フィルター、さまざまなアナライザー、ブースト、ペイロードなどを使用することを意味します)。
XQueryの全文検索機能の実装に着手しようとしています。
http://www.w3.org/TR/xpath-full-text-10/
そのクエリ機能は、私が見た中で最も複雑です。Luceneでの経験から、いくつかの機能を実装するために使用できることがわかっています。しかし、私はそれらすべてを歩きたいと思います。機能ごとに、「機能Xはクエリフィルターを使用して実装するのが最適です」などの簡単な答えだけが必要なので、各機能の正しい方向から始めます。
注:私は独自のクエリパーサーを実装し、Luceneクラスのさまざまなインスタンス化を使用して「手動で」クエリを作成します。
3.3カーディナリティの選択
これにより、次のように言うことができます。
title ftcontains "usability" occurs at least 2 times
つまり、タイトルフィールドには少なくとも2回「ユーザビリティ」が含まれている必要があります。これはどのように行うことができますか?
3.4.4ステミングオプション
これにより、インデックスに登録された単語を、次のようにステミングされたクエリ内の単語と照合できます。
title ftcontains "improve" with stemming
タイトルに「改善」が含まれていても一致します。ステミングを使用するかどうかの決定は、インデックス時ではなくクエリ時に指定されるため、PorterStemFilterは使用できないことに注意してください。
この場合、各単語をインデックスに2回追加する必要がありますか?元の単語に1回、語幹の単語に1回(語幹の単語が元の単語と異なると仮定して)?それとももっと良い方法はありますか?
3.4.5ケースオプション
これにより、クエリ時に「大文字と小文字を区別しない」、「大文字と小文字を区別する」、「小文字」、「大文字」のいずれかを指定できます。
最後の2つは、クエリフィルタを使用して実装できると思います。これは、「小文字」の場合、ドキュメントテキストがすべて小文字の場合にのみ一致するためです(「大文字」の場合も同じです)。
しかし、大文字と小文字を区別しない/大文字と小文字を区別する仕様をどのように処理しますか?1つの考えは、すべての単語を2回追加することです。1回は元のケースで、もう1回は正規化されたケース(たとえば、小文字になるように任意に選択されます)です。より良いアイデアはありますか?
3.4.6発音区別符号オプション
これは、「発音区別符号に依存しない」または「発音区別符号に敏感」を除いて、キャストオプションに似ています。これを実装するのはどうですか?
3.4.7ストップワードオプション
これにより、-qt query time-"with stop words"を指定できます。例:
abstract ftcontains "propagating of errors"
with stop words ("a", "the", "of")
「いくつかのエラーの伝播」を含む要約とドキュメントを照合します。奇妙に思えます、私は知っています。ストップワードがワイルドカードになるかのようです。つまり、次のようになります。
"propagating of errors" -> "propagating * errors"
ここで、*はドキュメント内の任意の単語と一致します。これをLuceneでどのように実装できますか?
3.5.3マイルド-選択しない
XQueryには、「not」の2つのフレーバーがあります。(通常の)notとmild-notです。これにより、次のようなクエリを実行できます。
body ftcontains "Mexico" not in "New Mexico"
これは、「ニューメキシコ」というフレーズの一部ではない場合にのみ「メキシコ」を含むドキュメントに一致します。これにはクエリフィルターを使用できると思いますね。
3.6.1順序付けられた選択
これにより、クエリ内の単語の順序がドキュメント内の単語の順序と一致することを要求できます。例:
title ftcontains ("web site" ftand "usability") ordered
これは、「Webサイト」というフレーズと「ユーザビリティ」という単語の両方がドキュメント内にあり、「ユーザビリティ」が「Webサイト」の後に語順で続く場合にのみ一致します。Lucene SpanQueryクラスは、単語の位置にアクセスできる必要がありますね。どのようにそれらにアクセスしますか?
3.6.4スコープの選択
これにより、単語が同じ「スコープ」に表示されるように要求できます。例:
abstract ftcontains "usability" ftand "web site" same sentence
{same | different} {sentence|paragraph}の任意の組み合わせを実行することもできます。これについての私の推測は、ペイロード内の文/段落データを追跡することでもあります。はい?
3.7オプションを無視する
部分的なXQueryが与えられた場合:
let $x := <book>
<title>Web Usability and Practice</title>
<author>Montana <annotation> this author is
an expert in Web Usability</annotation> Marigold
</author>
<editor>Vera Tudor-Medina on Web <annotation> best
editor on Web Usability</annotation> Usability
</editor>
</book>
クエリがある場合:
book ftcontains "Web Usability" without content $x//annotation
その場合、要素内のテキストはまったく考慮されません。「Webユーザビリティ」は2回見つかります。1回はtitle要素に、もう1回はeditor要素にあります。後者の要素は、「Webユーザビリティ」というフレーズの真ん中にあることに注意してください。これについての私の推測は、ペイロードデータを使用して各単語が内部にある要素を格納し、それに基づいてフィルターを使用することでもあります。はい?
これはたくさんあると思いますが、どんなポインタでもありがたいです。ありがとう!