2

我们正在我们系统中的许多不同资源中构建“统一”搜索。我们的索引模式包括大约 10 个被索引的通用字段,加上 5 个在返回结果时用于识别我们系统中适当资源位置的字段。

索引字段通常包含敏感数据,因此我们根本不希望它们存储,只为匹配而索引,因此我们将其设置_sourceFALSE.

但是,我确实希望返回 5 个 ident 字段,因此是否可以将 ident 字段设置为store= yes,但总体索引_sourceFALSE并获得我在结果中寻找的内容?

4

2 回答 2

3

也看看这个其他答案。正如那里提到的,在大多数情况下,该_source领域有很大帮助。尽管这看起来像是一种浪费,因为 elasticsearch 有效地存储了传入的整个文档,但这确实很方便(例如,当需要更新文档而不发送整个更新后的文档时)。归根结底,它隐藏了一个 lucene 实现细节,即如果您想取回字段,您需要显式存储字段,而用户通常希望取回他们发送给搜索引擎的内容。令人惊讶的是,这_source也有助于提高性能,因为它需要一次磁盘查找,而不是可能由检索多个存储字段引起的更多磁盘查找。在一天结束时_sourcefield 只是一个包含 json 的大 lucene 存储字段,可以对其进行解析以获取特定字段并对其进行一些处理,而无需单独存储它们。

也就是说,根据您的用例(您检索多少字段),查看_source 字段引用底部的源包含/排除可能会很有用,它允许您防止部分(例如文档的敏感部分) 的源字段被存储。如果您想继续依赖_source但不希望返回输入文档的一部分,但您确实想搜索这些字段,因为它们将被索引(但不存储!)在底层 lucene 索引中。

在这两种情况下(_source完全禁用或排除某些部分),如果您计划更新文档,请记住您需要使用索引 api 发送整个更新的文档。实际上,您不能依赖更新 api 提供的部分更新,因为您在索引中没有您首先索引的完整文档,您需要对其应用更改。

于 2013-09-17T17:24:31.963 回答
1

是的,存储字段不依赖于_source字段,反之亦然。它们是分开的,更改或禁用一个不应影响另一个。

于 2013-09-16T17:51:15.567 回答