【问题标题】:Is it need to store all other fields in Solr when using In-Place Updates of single field?使用单个字段的就地更新时是否需要将所有其他字段存储在 Solr 中?
【发布时间】:2019-04-10 07:50:53
【问题描述】:

我正在尝试向项目添加全文搜索功能。我不想存储所有文档的全部内容,所以我决定将 stored="false" 用于“content”字段。此外,还有一个布尔字段来指示文档是否被删除。当我在 Solr 中创建一个新文档时,它工作得很好。但是当我更新 is_deleted 字段时 - “内容”似乎从索引中丢失了,我不能再搜索这个文档了。

我发现 a post 说就地更新时不需要存储字段,但这对我不起作用。

一些细节:

架构:

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="_version_" type="plong" indexed="false" stored="false" docValues="true"/>
<field name="is_deleted" type="boolean" indexed="false" stored="false" docValues="true"/>
<field name="content" type="text_general" indexed="true" stored="false" multiValued="true"/>

使用“/update”处理程序添加测试文档:

{
"id": "doc1",
"is_deleted": false,
"content": "SEARCH ME"
}

更新文档:

{
"id": "doc1",
"is_deleted": {"set": true}
}

使用 Solr v 7.5.0。

Solr In-Place update documentation 没有说明需要为此类更新存储所有字段。

【问题讨论】:

  • 您有任何copyField说明吗?如果是这样,他们还必须符合就地更新的要求才能进行。

标签: solr lucene


【解决方案1】:

我找到了解决方案。这是我的错误——我认为布尔字段是数字的。所以这就是就地更新对我不起作用的原因(因为 Solr 做了一个常见的原子更新)。

由于我已将 is_deleted 字段从 boolean 更改为 int,一切正常,并且在更新 is_deleted 时我不会丢失来自 content 的数据。

所以答案是: 使用就地更新时,Solr 不需要存储所有字段。

感谢 EricLavault 提及字段类型要求。很有帮助)

【讨论】:

  • 是的......但我在主要事情上错了! @MatsLindh 您知道何时使用此配置吗?因为当 Solr 引入部分更新时,我确信如果不存储它就无法工作,我为此浪费了足够的时间,Solr 无法提交文档的一部分,并且所有未更新的字段都必须从它们的 加载存储 (因此我指向以“添加”操作结尾的“更新”操作)。我在想这个功能是在哪个版本生效的。
  • 是的,但就地更新与部分更新不同。定期的原子部分更新仍然需要将所有字段设置为存储。这只是当就地更新的所有要求都存在时(这比常规原子更新更严格,只需要存储为真),Lucene 可以更新该单个值而不必重新运行通过分析链的所有其他字段。第一个版本的就地更新是在 6.5 中添加的。
  • 好的,谢谢你的总结。看来我从来不想接受这样的想法,是的,Solr 终于可以真正进行就地更新了。那时我显然错过了一些东西,从那以后我就错了那个功能......假设是邪恶的。
猜你喜欢
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2012-03-24
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多