我有一个分布在多个分片和副本上的文档索引。大小约为。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 将 ids 转换为 bitset
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,我像这样覆盖 parse:
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 有点陌生。
谢谢