• ElasticSearch中的_source和store:既生瑜何生亮


    先介绍一个_source和store:                                     
    (1):_source默认是打开的,将原始文档以JSON的形式存储在_source字段中,在lucene中_source只是一个字段,即在一个字段中存储了一个文档中所有字段的值。_source是es层面的设置,相当于给lucene多加了一个字段用于存储整个原始文档的值。

    (2):字段中的store属性默认是false,即为不存储该字段;如果该字段的store属性设置为true,则在lucene中该字段的值被单独存储。

    从以上可知,_source字段和字段属性store设置为true这两种情况都可以存储文档的字段值,如果同时都存储,岂不是重复存储了吗?那这两种情况有区别吗?
    (1):在_source设置为打开,并且所有字段的store属性都设置为false的情况下,只在 _source字段中存储原始文档;当搜索时默认返回_source中的完整文档;如果只想返回某几个字段,则可以通过fields或者_source指定需要返回的字段,此时,es会自动从_source中抽取指定要返回的字段值。在这种情况下,无论是返回完整的文档,还是通过设置只返回某几个字段的值,都只需要一次磁盘IO,因为完整的文档都在_source一个字段中存储。

    (2):在_source设置为关闭,并且所有字段的store都设置为true的情况下,_source字段中不再存储完整的原始文档了,文档的内容都以字段为单位,单独的被存储了。在这种情况下,查询结果中返回几个字段,就要进行几次磁盘IO,因为每个字段都是被单独存储的。

    (3):在_source设置为打开,并且某几个字段的属性store被设置为true的情况下,_source字段中存储了原始文档,且那几个字段又被单独的存储了一次;在这种情况下,如果想返回这几个字段中的某一个或某几个时,es不会再从_source中抽取字段值了,而是直接从单独存储的字段中加载。

    结论:
    (1):即使文档中每个字段都设置成store=false:即不存储,es也把文档的原始内容在_source字段中存储了下来。

    (2):如果字段被设置成store=true:即存储,则相当于字段值被存储了两次;如果考虑磁盘IO的性能和内容抽取方面的事情,存储两次可能有好处,但是在其他情况下存两次就是多余。

    附加:
    我们都知道es是基于lucene的,那么我们探讨一下lucene中的store属性;在lucene中如果字段的store属性被设置成true,就被存储;否则就不存储;不存储的字段,就不会出现在查询的返回结果中。ES自己加了一个_source,无论字段设置成是否存储,整个原始文档的内容都会被存储在_source字段中;这样以来,在绝大部分情况下,不用给每个字段的store属性设置成true,直接使用默认的false即不存储即可;因为可以从_source字段中返回文档的内容。

  • 相关阅读:
    JAVA多线程(七) ReentrantLock原理分析
    JAVA多线程(六) synchronize原理分析
    JAVA多线程(五) volatile原理分析
    pandas
    从美国总经理,到三一重卡的董事长,梁林河的重卡梦
    【转载】低水平领导的十大表现
    kill及其衍生程序
    python -m venv 的使用
    Python多版本启动器
    Pyinstaller最流行的打包程序
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302430.html
Copyright © 2020-2023  润新知