使用Elasticsearch 1.4.3
我正在构建一种“报告”系统。客户端可以选择并选择他们想要在结果中返回的字段。
在90%的情况下,客户端永远不会选择所有字段,所以我想我可以在映射中禁用_source字段以节省空间。但后来我了解到了
GET myIndex/myType/_search/
{
"fields": ["field1", "field2"]
...
}
不返回字段。
所以我假设我必须使用“store”:每个字段都为true。从我读到的内容来看,搜索速度会更快,但我想空间方面它与_source相同或者我们还能节省空间吗?
答案 0 :(得分:7)
_source
字段存储您发送给Elasticsearch的JSON,您可以选择仅在需要时返回某些字段,这非常适合您的用例。我从未听说过搜索存储的字段会更快。 _source
字段在磁盘空间上可能更大,但如果您必须存储每个字段,则无需在_source
字段上使用存储的字段。如果您确实禁用了源字段,则意味着:
答案 1 :(得分:5)
默认情况下,弹性搜索会存储_source
(索引的文档)。这意味着当您搜索时,您可以获得实际的文档源。此外,elasticsearch将自动从fields/objects
中提取_source
并在您明确要求时返回它们(以及可能在其他组件中使用它,如突出显示)。
您可以指定还存储特定字段。这意味着该字段的数据将存储在中。这意味着如果您要求field1
(已存储),elasticsearch将识别其存储,并从索引加载而不是从_source
获取它(假设_source
已启用)。
您希望何时启用存储特定字段?大多数时候,你都没有。获取_source
很快并且提取它也很快。如果您有非常大的文档,其中存储_source
的成本或解析_source
的成本很高,您可以显式映射一些要存储的字段。
注意,检索每个存储的字段需要付出代价。因此,例如,如果你有一个包含10个大小合理的字段的json,并且你将所有这些字段映射为存储,并要求所有这些字段,这意味着加载每个字段(更多的磁盘搜索),而只是加载{ {1}}(这是一个字段,可能已压缩)。
我在shay.banon回答的以下链接上得到了这个答案,你可以阅读这整个帖子以便对它有所了解。 enter link description here
答案 2 :(得分:4)
启用_source
会将整个JSON文档存储在索引中,而store
只会存储标记为的单个字段。因此,如果要节省磁盘空间,使用store
可能比使用_source
更好。
答案 3 :(得分:4)
Clinton Gormley在下面的链接中说道
https://groups.google.com/forum/#!topic/elasticsearch/j8cfbv-j73g/discussion
默认情况下,ES将您的JSON文档存储在_source字段中,即 设置为"存储"
默认情况下,JSON文档中的字段设置为不存储"存储" (即存储为单独的字段)
所以当ES返回你的doc(搜索或获取)时,它只需加载_source 字段并返回,即单个磁盘搜索
有些人认为通过存储单个字段会更快 而不是从_source字段加载整个JSON文档。他们没有做什么 实现的是每个存储的字段都需要磁盘搜索(每次寻找10ms! ),那些寻求的总和远远超过了公正的成本 发送_source字段。
换句话说,它几乎总是错误的优化。
答案 4 :(得分:2)
作为 ES 7.3 的参考,答案变得更加清晰。 请勿在您有充分的测试理由之前尝试进行优化不现实的生产条件。
我可能只引用_source:
用户经常禁用
_source
字段而无需考虑 后果,然后过后悔。如果_source
字段不是 可用,则不支持许多功能:
update
,update_by_query
, 和reindex
API。动态突出显示。
从一个Elasticsearch索引重新索引到另一个索引的能力 更改映射或分析,或将索引升级到新的专业 版本。
通过查看原始内容调试查询或聚合的功能 索引时使用的文档。
将来可能会修复索引损坏 自动。
提示:如果需要磁盘空间,请增加 压缩级别,而不是禁用
_source
。
此外,您可能会想到,使用stored_fields
并没有明显的优势。
如果您只想检索单个字段或几个字段的值而不是整个_source的值,则可以使用
source filtering
来实现。