3

以前のプロジェクトで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ユーザビリティ」というフレーズの真ん中にあることに注意してください。これについての私の推測は、ペイロードデータを使用して各単語が内部にある要素を格納し、それに基づいてフィルターを使用することでもあります。はい?


これはたくさんあると思いますが、どんなポインタでもありがたいです。ありがとう!

4

1 に答える 1

1

GitHub でリリースしたばかりの Lux プロジェクト ( https://github.com/msokolov/lux ) をチェックしてみてください。Saxon XQuery プロセッサと Lucene/Solr を統合し、XQuery を介して全文検索機能を提供します。私が採用したアプローチは、XQuery フルテキストをそのまま実装するのではなく、Lucene クエリ機能を直接公開する検索機能を提供することでした。ただし、同様のアプローチを使用して xqft を実装できると思います。Lux には 2 種類のインデックスがあります。パス インデックス (oelement と属性名を含む) と、ノード名を (ペイロードではなく) トークン テキストの一部として含むテキスト インデックスです。これにより、既存の Lucene クエリを簡単に使用できます。

しかし、あなたの質問によりよく答えるために: 大きなスロップを持つ SpanNearQuery を使用して 3.3 を実装できると確信しています。

3.4、3.5、3.6、および 3.7 の場合: クエリ時間分析の選択 (ステミング、大文字と小文字の区別など) を可能にするために、2 つの可能性があります: 複数のフィールドを作成し、分析オプションの選択ごとに 1 つ、または複数を追加します。分析オプションの組み合わせごとに同じ位置にあるトークン。ただし、2番目のオプションでは、各トークンに情報を追加して、トークンの作成に使用された分析設定を示す必要があり、Luceneはそこで何の助けにもなりません-ペイロードの追加やプレフィックスの追加などのハックを行う必要がありますどういうわけかテキストという用語。

うーん - この質問は 2 年前に尋ねられ、回答されていないことに気付きました。そうですね - それは明らかに大きなプロジェクトです!

于 2013-01-26T21:21:27.053 に答える