是否可以在不从原始源重新索引的情况下更改 Solr 架构中指定的分析器?

Posted

技术标签:

【中文标题】是否可以在不从原始源重新索引的情况下更改 Solr 架构中指定的分析器?【英文标题】:Is it possible to change the analyzer specified in the schema in Solr without reindexing from the original source? 【发布时间】:2011-05-01 13:24:55 【问题描述】:

在 Solr 中,如果我们在 schema 中有一个字段为 stored="true",并且我们更改了与该字段关联的分析器,是否可以只更新该字段而不重新索引所有文档?这是否可以在不返回原始数据源的情况下使用新分析器的字段“存储”值来完成?

【问题讨论】:

这似乎类似于this。 【参考方案1】:

伙计,我优化了你的代码。

    ...
    while (iter.hasNext()) 
        ...
        //server.deleteById(id) ;
        //server.commit() ;

        Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
        docs.add(inputdoc) ;
        server.add(docs) ;
        // server.commit() ;
    
    server.commit() ;

【讨论】:

【参考方案2】:

我找到了一种使用 SolrJ 的方法。

        SolrQuery query = new SolrQuery();

        query.setQuery( "whatever_by_id" );

        QueryResponse rsp;

        rsp = server.query(query);

        Iterator<SolrDocument> iter = rsp.getResults().iterator();

        while (iter.hasNext()) 
            SolrDocument resultDoc = iter.next();
            String id = (String) resultDoc.getFieldValue("oid"); //id is the uniqueKey field

            SolrInputDocument inputdoc = new SolrInputDocument() ;
            for( Map.Entry<String, Object> f : resultDoc.entrySet()) 
                inputdoc.setField(f.getKey(), f.getValue()) ;
            

            server.deleteById(id) ;
            server.commit() ;

            Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
            docs.add(inputdoc) ;
            server.add(docs) ;

            server.commit() ;
        

当我们添加“新”输入文档(旧 resultDoc 的副本)时,它使用我们在架构中更改的新分析器来索引。它不是很优雅,但很有效。

【讨论】:

是的 xD,但不是所有的文件。第一次完全导入花了 8 个小时,我不想重复它 xD。【参考方案3】:

看看这个IBM Tutorial for Solr

【讨论】:

以上是关于是否可以在不从原始源重新索引的情况下更改 Solr 架构中指定的分析器?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不运行 DbVisualizer + SQLite 中的原始 sql 的情况下更改列

如何在不重新加载页面的情况下更改 URL?

是否可以在不从 DOM 读取的情况下在 Angular 中读取元素的文本内容?

有没有办法在不重新启动 Solr 服务器的情况下动态更新同义词文件?

架构更改是不是需要重新索引所有 Solr 文档或仅包含已更改架构字段的文档?

Elasticseach-强制字段仅索引,避免存储