在我的.net core
项目中,我通过以下方法更新SOLR文档:
public Task<HttpResponseMessage> UpdateDocumentAsync(List<SolrDocument> SolrDocument, CancellationToken cancellationToken)
{
_request.Method = HttpMethod.Post;
_request.RequestUri = new Uri($"{this._baseUri}/update?overwrite=true&commitWithin=2000&wt=json");
var content = new StringContent(JsonConvert.SerializeObject(SolrDocument), Encoding.UTF8, "application/json");
_request.Content = content;
return base.SendAsync(_request, cancellationToken);
}
正如你所看到的,我甚至声明overwrite=true
命令对我的更新URL.在发布这个问题之前,我遇到了其他类似的主题,并看到定义一个唯一的字段SOLR模式将有所帮助,否则SOLR将永远不会知道我是否更新和现有的文档.然后我检查了我的模式,看到一个唯一的字段已经定义.我分享我的模式的必要部分如下:
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="My Project Solr 7.2.0 (stable version) Instance" version="1.6">
<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="_version_" type="long" indexed="true" stored="true"/>
<!-- tons of other fields -->
<uniqueKey>id</uniqueKey>
这样我就找不到真实的的问题了,我在SOLR中更新一张单据时,会产生另一张id
相同,_version_
不同的单据,之后我发\select
请求,查询id:12345
,SOLR会列出一张单据但是有时候会带来更新的单据,有时候会带来没有更新的单据。
需要说明的是,SOLR从不列出两个具有相同id的文档,但是同一文档的旧版本仍然继续存在于SOLR中,因此,这导致了应用程序上的超级混乱。
仅供参考,我最近通过添加一些额外的字段更新了架构。在上面描述的问题中,我无法在旧文档上看到新字段(这是非常正常的),但我可以看到我的新字段上的 * 其他 * 更新的文档与不同的_version_
(但是id
是一样的),是这样吗?如果是这样的话,在更新的时候,如何强制SOLR处理掉当前不包含新字段的单据?
先谢了。
1条答案
按热度按时间k5hmc34c1#
结果是我当前的
core
与文档的原始核心不同,因此最终用一个新的_verion_
索引了我当前的核心。