luceneがフィールド内のすべての用語を単一の用語として扱うようにします
-
03-07-2019 - |
質問
Luceneドキュメントには、フィールド「company」があります。会社名はトークン化されます。 アプリケーションの特定の部分にトークン化が必要です。 しかし、このクエリでは、会社のフィールド全体にPrefixQueryを作成できる必要があります。
例:
- 私のブランド
- my
- ブランド
- ブラミン農場
- ブラミン
- 農場
" bra"の定期的なクエリ両方ともbraで始まる用語があるため、両方のドキュメントが返されます。
ただし、最初の用語はbraで始まるため、結果は最後のエントリのみを返します。
提案はありますか
解決
SpanQuery 最初の用語の位置のみを検索します。 SpanPositionRangeQueryでラップされたSpanMultiTermQueryWrapperでラップされたPrefixQuery:
<SpanPositionRangeQuery: spanPosRange(SpanMultiTermQueryWrapper(company:bra*), 0, 1)>
他のヒント
別のインデックス付きフィールドを作成します。会社名はトークン化されません 。必要に応じて、トークン化された会社名フィールドではなく、そのフィールドで検索します。
高速検索が必要な場合は、目的のレコードを直接指すインデックスエントリが必要です。レコードをフィルタリングするために近接データを使用してできることもありますが、速度は遅くなります。私は問題を次のように見ています。完全なフィールドに対するクエリは効率的に実行されますか?
「現在のフィールドごとに」「最初の用語」を作成することにより、インデックスサイズの増加を最小限に抑えることができる場合があります。フィールドと「残りの用語」フィールド。これにより、2つのフィールドでの最初の用語の重複がなくなります。 「通常」の場合クエリでは、これらのフィールドのいずれかでクエリ用語を探します。 「で始まる」の場合クエリでは、「最初の用語」のみを検索します。フィールド。しかし、これはそれが価値がある以上のトラブルのようです。