2

Title、Brand、Category、Size、Color、Material という複数のフィールドを持つ製品エンティティの Document オブジェクトを定義します。

今、ユーザーが複数のフィールドで AND 検索を実行できるようにしたいと考えています。1 つ、2 つ、またはそれ以上のフィールドがすべての検索語を含むドキュメントが応答されます。

たとえば、ユーザーが「gucci shirt red」と入力すると、「gucci」、「shirt」、「red」の 3 つのトークンすべてに一致するフィールドを持つすべてのドキュメントを返したいとします。したがって、以下のすべての文書が回答されます。

1.タイトル付きのドキュメントには、3 つの単語がすべて含まれています。たとえば、タイトル = "グッチ モダン シャツ レッド" または "グッチ ブルー シャツ"...

2.タイトルが「グッチ クラシカル シャツ」かつ色が「赤」のドキュメント

3. カテゴリ = "メンズ シャツ" AND ブランド = "gucci" AND 色 = "red" のドキュメント

4.など

Lucene は、検索クエリの MUST を行う演算子 + をサポートしていることを知っています。たとえば、上記のキーワードを「+gucci +shirt +red」というクエリに変換すると、上記の例 (1) のドキュメントが確実に応答されると確信しています。しかし、上記の(2)と(3)の場合はうまくいきますか?

4

3 に答える 3

7

これらのタイプのクエリを実行するとき、私は次のことを好みます:マスター BooleanQuery を作成し、連携して最良の結果を得るためにいくつかのサブクエリを追加します

  • TermQuery: (完全一致)、誰かがタイトルの完全一致を入力
  • PhraseQuery: (slop を使用) したがって、「Gucci Modern Shirt Red」があり、誰かが「Gucci Shirt」と入力した場合 (1 つの単語のギャップに注意してください)、一致します。
  • FuzzyQuery: (大規模な (> 5000 万レコード)/非メモリ インデックスでは遅い) スペルミスの可能性を考慮します。
  • Boolean SubQuery:すべての用語が区切られ、OR されます。4 つの単語のうち 1 つに一致するクエリはスコアが低くなりますが、3/4 の単語はスコアが高くなります。
  • Query Parse (フィールド ブーストの可能性がある上記のとおり)
  • その他:語句の類義語検索など。

これらすべてのタイプを OR し、コレクターの最小スコアを使用してフィルターで除外します。

私がマスター BooleanQuery アプローチを気に入っている理由は、ユーザーがクエリの「タイプ」を選択する設定ができるからです。たぶんシンプル - >高度で、クエリタイプをその場ですばやく追加/削除するのは簡単で、クエリは非常に簡単に構築でき、予測結果が得られます。内部の Lucene アルゴリズム内で作業しているレコード/類似性を高めるため、結果が明確でない場合があります。

パフォーマンス: 私は Lucene 3.0.x を使用して 1 億件以上のレコードが NOT IN MEMORY のインデックスでこのようなクエリを実行しました。あいまいクエリは速度を低下させますが、前述のように、高度な検索オプション (または「... で再検索」) にすることができます。

于 2013-10-08T18:33:07.150 に答える
3

いいえ、クエリで明示的に検索するフィールドが指定されていない場合、デフォルトのフィールドに移動します。これは、あなたの場合は「タイトル」に表示されます。次のようなクエリが必要になります。

+shirt +color:red +brand:gucci

例えば。

または、一般的な使用方法の 1 つは、検索可能なデータのすべて (または大部分のサブセット) が一緒にマッシュアップされるキャッチオール フィールドを設定することです。次のようなものを使用してください:

all:(+shirt +gucci +red)

または、代わりにそのフィールドをデフォルト フィールドにした場合:

+shirt +gucci +red

ご指摘のとおりです。

于 2013-10-07T17:01:57.810 に答える