シナリオは次のとおりです。
- 現在、テキスト フィールドは MongoDB に格納されています。
- フィールドは平均で 1KB を超えるため、インデックスを作成できません。
- テキスト フィールドで正確なフレーズ検索を実行する必要がある。
検索の要件は次のとおりです。
?
(任意の)単一または複数の文字( 、*
またはなど)のプレースホルダー/ワイルドカードを使用できる必要があり(.)(.*)
ます。- 検索されたテキスト内のフレーズの位置を示すことができる必要があります (先頭、任意の場所、末尾:
phrase%
、%phrase%
、%phrase
)。 - 結果は完全に一致する必要があります。
私がすでに試したこと:
- mongodb にはインデックス付きフィールドに 1KB の制限があるため、フィールドはインデックス可能ではありません。
- テキストを 1KB のチャンクに分割します。正規表現はまだ遅く、検索されたフレーズが (^phrase) でない場合はインデックスを使用していません。
- MongoDB 全文検索 - フレーズの位置と完全一致を照会できるかどうかわかりません。
- Solr を使用しようとしましたが、うまくいきませんでした (ComplexPhraseQueryParser を有効にして)。
- ComplexPhraseQueryParser (ワイルドカードをサポート) は lucene に組み込まれていますが、テキスト内で検索されたフレーズの位置を示す方法と完全一致のみを取得する方法がわかりません。
現在考えられる解決策は、テキスト フィールドを RDBMS に保持し (MySQL、それは良い考えですか? varchar とテキスト フィールドのインデックス作成の制限については不明です)、LIKE 演算子を使用することですが、いくつかの提案を聞きたいです:
- すべてを MongoDB に組み込み、その組み込み機能を使用できれば素晴らしいことです。
- または、solr を使用します。これは、他の検索機能に使用され、信頼性が高く、スケーラブルなどであるためです。
- または、solr と同じように lucene を使用しますが、スケーラビリティ、レプリケーション、およびその他の問題に自分で対処する必要があります。
- 他のオプションはありますか?
アップデート:
現在の MongoDB バージョンでは要件を満たすことができないという結論に達したので、solr の方向に少し進みました。これは私がこれまでに得たものです:
- Solr クエリは機能します (
/.*sear.* ph.ase.*/
)。 - テキストの先頭の正規表現検索は、予想どおり非常に高速です (
/sear.* ph.ase.*/
)。 - その他、中間と末尾 (
/.*sear.* ph.ase.*/
,/.*sear.* ph.ase/
) は少し遅いです (solr で 200,000 ドキュメント内を検索するには、私のワークステーションで約 900 ミリ秒かかります)。
検索された solr フィールド タイプは次のとおりです。
<fieldType name="text_keyword_lowercase" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
これに関する提案はありますか?
ありがとう!