0

我有一个分布在多个分片和副本上的文档索引。大小约为。4000万,我预计它会增长

问题:用户将信息添加到这些文档中,他们经常更改这些信息。他们需要将其集成到搜索语法中,例如funny and cool and cat:interesting. cat 将是一个易失的数据集

据我所知,Solr 和 Lucene 都不支持“真正的更新”,这意味着我必须再次重新索引整个更改的文档集。因此我需要将它连接到外部数据源,例如关系数据库。

我在 Lucene 中使用可扩展搜索 ( http://lucene.apache.org/core/4_3_0/queryparser/index.html ) 做到了这一点。该算法非常简单:

  1. 通过向所有外部字段添加“_”来预处理查询
  2. 将这些字段映射到类
  3. 每个类都扩展 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"));
        }
    
  4. 然后通过扩展 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); }

  5. 使用 add 方法扩展 org.apache.lucene.queryparser.ext.Extensions 并完成。

但是如何在 Solr 中做到这一点?

我发现了几个建议:

  1. 使用外部字段(http://lucene.apache.org/solr/4_3_0/solr-core/org/apache/solr/schema/ExternalFileField.html
  2. NRS(http://wiki.apache.org/solr/NearRealtimeSearch)对我来说看起来有点建设中。

任何想法如何在 Solr 中做到这一点?也许有一些代码示例?

请考虑一下我对 Solr 有点陌生。

谢谢

4

1 回答 1

1

Solr 4.x 发布了所有支持原子更新,我相信这可以满足您的需求。

于 2013-05-15T12:41:17.490 回答