0

Luceneのドキュメントには、会社名がトークン化された「company」フィールドがあります。アプリケーションの特定の部分にトークン化が必要です。ただし、このクエリでは、会社のフィールド全体に対してPrefixQueryを作成できる必要があります。

例:

  • 私のブランド
    • 私の
    • ブランド
  • バラモン農場
    • バラモン
    • 農場

定期的に「bra」をクエリすると、両方のドキュメントにbraで始まる用語が含まれているため、両方のドキュメントが返されます。
ただし、最初の項はブラで始まるため、必要な結果は最後のエントリのみを返します。

助言がありますか?

4

2 に答える 2

1

会社名がトークン化されていない別のインデックス付きフィールドを作成します。必要に応じて、トークン化された会社名フィールドではなく、そのフィールドを検索します。


高速検索が必要な場合は、対象のレコードを直接指すインデックス エントリが必要です。レコードをフィルタリングするために近接データを使用できることはあるかもしれませんが、遅くなります。問題は次のとおりです。完全なフィールドに対する「含む」クエリを効率的に実行するにはどうすればよいですか?

(現在のフィールドごとに) 「最初の用語」フィールドと「残りの用語」フィールドを作成することで、インデックス サイズの増加を最小限に抑えることができる場合があります。これにより、2 つのフィールドでの最初の項の重複がなくなります。「通常の」クエリの場合、これらのフィールドのいずれかでクエリ用語を探します。「startswith」クエリでは、「first term」フィールドのみを検索します。しかし、これは価値があるよりも面倒なようです。

于 2009-03-03T14:40:33.937 に答える
0

SpanQueryを使用して、最初の用語の位置のみを検索します。SpanPositionRangeQuery によってラップされた SpanMultiTermQueryWrapper によってラップされた PrefixQuery:

<SpanPositionRangeQuery: spanPosRange(SpanMultiTermQueryWrapper(company:bra*), 0, 1)>
于 2011-10-26T00:56:28.270 に答える