当前位置: 首页 > 面试题库 >

为什么在Elasticsearch中需要“存储”:“是”?

祁彬
2023-03-14
问题内容

我真的不明白为什么在核心类型链接中会在属性描述中说(例如,对于一个数字):

  1. store-设置为yes,将实际字段存储在索引中,否,则不存储它。默认为no(请注意, JSON文档本身已存储,可以从中检索
  2. index-如果不应为该值建立索引,则设置为no。在这种情况下,应该将store设置为yes,因为如果未对它进行索引和存储, 则与它无关

这两个大胆的部分似乎矛盾。如果"index":"no", "store":"no"我仍然可以从源头获得价值。例如,如果我有一个包含URL的字段,这可能是一个好用法。没有?

我做了一个小实验,我有两个映射,一个映射到一个字段,另一个映射"store":"yes""store":"no"

在两种情况下,我仍然可以在查询中指定:

{"query":{"match_all":{}}, "fields":["my_test_field"]}

我得到了相同的答案,返回了现场。

我认为,如果"store"设置为"no"true ,则意味着我无法撤消特定领域的工作,而必须获得全部内容_source并在客户端进行解析。

那么,什么好处是在有设置"store""yes"?仅当我从"_source"字段中明确排除该字段时,才有意义吗?


问题答案:

我认为,如果将“ store”设置为“ no”,则意味着我无法检索特定字段,而必须获取整个_source并在客户端进行解析。

当未存储字段(默认)并且_source启用该字段(也是默认值)时,这就是elasticsearch为您所做的。

您通常将字段发送给elasticsearch,因为您要在其上搜索或检索它。但是,确实,如果您没有显式存储字段并且没有禁用源,您仍然可以使用来检索字段_source。这意味着在某些情况下,具有未索引或未存储的字段实际上可能有意义。

当您存储字段时,这是在底层的lucene中完成的。Lucene是一个倒排索引,它允许快速的全文本搜索并在给定文本查询的情况下返回文档ID。除了倒排索引之外,Lucene还具有某种类型的存储,可以在其中存储字段值,以便在给定文档ID的情况下进行检索。您通常将希望返回的字段存储在lucene中作为搜索结果。Elasticsearch不需要存储要返回的每个字段,因为默认情况下它始终存储您发送给它的每个文档,因此它始终能够返回您发送给它的所有内容作为搜索结果。

仅在少数情况下,将字段显式存储在lucene中可能会很有用:_source禁用字段时,或者当我们希望避免对其进行解析时,即使解析是由Elasticsearch自动完成的。请记住,尽管从Lucene检索许多存储的字段可能需要每个字段一个磁盘查找,而_source仅从Lucene
检索并解析它以检索所需的字段只是单个磁盘查找,并且在大多数情况下会更快。



 类似资料:
  • 问题内容: 特别是在Python中,如何在线程之间共享变量? 尽管我以前从未使用过,但从未真正理解或看到过如何共享变量的示例。它们是在主线程和子线程之间共享还是仅在子线程之间共享?我何时需要使用线程本地存储来避免这种共享? 我已经看到许多有关通过使用锁在线程之间同步对共享数据的访问的警告,但是我还没有看到这个问题的一个很好的例子。 提前致谢! 问题答案: 在Python中,所有内容都是共享的,但函

  • 这个问题涵盖了一个软件算法 我正在解决亚马逊软件问题中的一个面试问题,特别是< br >“给定一组点(x,y)和一个整数“n”,返回n个接近原点的点” 下面是这个问题的高级伪代码示例答案,来自示例答案 步骤1:设计一个名为point的类,它有三个字段-int x,int y,int distance 第2步:对于所有给定的点,找到它们与原点之间的距离 第一步:将值存储在二叉树中 我同意步骤1和2,

  • 问题内容: 在64位系统上,Python中的整数占用24个字节。这是C语言中64位整数所需内存的3倍。现在,我知道这是因为Python整数是对象。但是,额外的内存又有什么用呢?我有我的猜测,但肯定会很高兴。 问题答案: 请记住,Python类型没有C那样有限的范围。唯一的限制是可用内存。 内存用于存储值,整数存储的当前大小(存储大小可变以支持任意大小)以及标准的Python对象簿记(对相关对象的引

  • 问题内容: 在Golang中,我们将结构体与接收器方法结合使用。到这里为止一切都很完美。 我不确定什么是接口。我们在结构中定义方法,如果要在结构上实现方法,则无论如何都要在另一个结构下再次编写该方法。 这意味着接口似乎只是方法定义,仅占用了页面上多余的空间。 有没有解释我为什么需要接口的示例? 问题答案: 接口太大了,不能在这里给出全面的答案,但是有些事情需要弄清楚它们的用途。 接口是一种 工具

  • 问题内容: 我知道String [] args是作为参数传递给main的字符串数组。 但是,当您不将其包含为参数时(即使您不使用它),它也会引发异常。那么为什么需要它呢?另外,为什么不能是int []或boolean []? 问题答案: 这是一个字符串,因为命令行以文本形式表示。如果要将文本转换为整数或布尔值,则必须自己做- 操作系统或Java引导程序如何确切知道您希望如何解析所有内容?我想Jav

  • 问题内容: 我可以将数据发送到服务器,但是只有在使用FromBody-Attribute时才可以。 为什么无法使用Post从主体自动读取json数据? 后端Web API 前端angularjs 问题答案: 仅因为某事是POST请求,所以没有明确的规则如何传递参数。POST请求仍可以包含URL中编码的查询参数。方法参数应该是“简单”类型(字符串,整数等)的查询参数。 通常,复杂类型应该是POST表