【问题标题】:In Elasticsearch, what happens if I set 'store' to yes on a few fields, but _source to false?在 Elasticsearch 中,如果我在一些字段上将 'store' 设置为 yes,但将 _source 设置为 false,会发生什么情况?
【发布时间】:2013-09-20 22:48:13
【问题描述】:

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

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

但是我确实希望返回 5 个 ident 字段,因此是否可以将 ident 字段设置为 store = yes,但将整体索引 _source 设置为 FALSE 并得到我想要的结果呢?

【问题讨论】:

    标签: elasticsearch lucene


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常有用的信息!特别是与性能有关,这将作为一个小索引开始,而我们将其提升,因此重建索引不会受到太大影响,如果我们能够获得 _source 的性能提升,同时使用排除而不是显式包含,那将更有意义。谢谢!
    • 不用担心,只需运行一些测试,看看什么更适合您的用例!
    【解决方案2】:

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

    【讨论】:

    • 我想但想确认一下,文档似乎对这种区别不太清楚,感谢您的加入。
    猜你喜欢
    • 1970-01-01
    • 2019-07-19
    • 2011-08-06
    • 2010-09-30
    • 2016-12-12
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多