いくつかのシャードとレプリカに分散されたドキュメントのインデックスがあります。サイズは約です。4000万、私はそれが成長することを期待しています
問題: ユーザーはこれらのドキュメントに情報を追加しますが、これらの情報は頻繁に変更されます。たとえば、検索構文に統合する必要がありますfunny and cool and cat:interesting
。cat が揮発性データセットになる場所
私が知る限り、Solr も Lucene も「真の更新」をサポートしていません。つまり、変更されたドキュメントのセット全体を再度インデックス化する必要があります。したがって、リレーショナル データベースなどの外部データ ソースに接続する必要があります。
拡張可能な検索を使用して Lucene で実行しました ( http://lucene.apache.org/core/4_3_0/queryparser/index.html )。アルゴリズムはとても簡単でした:
- すべての外部フィールドに「_」を追加してクエリを前処理する
- これらのフィールドをクラスにマップします
各クラスは org.apache.lucene.search.Filter クラスを拡張し、 public をオーバーライドして ID をビットセットに変換します
public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs) throws IOException
。ResultSet set = state.executeQuery(); OpenBitSet bitset = new OpenBitSet(); while (set.next()) { bitset.set(set.getInt("ID")); }
次に、org.apache.lucene.queryparser.ext.ParserExtension を拡張して、次のように解析をオーバーライドします。
public Query parse(ExtensionQuery eq) throws ParseException{ String cat= eq.getRawQueryString(); Filter filter = _cache.getFilter(cat); return new ConstantScoreQuery(filter); }
- add メソッドを使用して org.apache.lucene.queryparser.ext.Extensions を拡張し、完了しました。
しかし、 Solrでこれを行う方法は?
私はいくつかの提案を見つけました:
- 外部フィールドの使用 ( http://lucene.apache.org/solr/4_3_0/solr-core/org/apache/solr/schema/ExternalFileField.html )
- NRS ( http://wiki.apache.org/solr/NearRealtimeSearch ) は、私には少し建設中のように見えます。
Solrでそれを行う方法はありますか? 多分いくつかのコード例がありますか?
私がSolrを初めて使用することも考慮してください。
ありがとうございました