es的_source ,index,store重要字段的理解!!!!!!_健康平安的活着的博客

CSDN博客__source es · · 182 次点击 · · 开始浏览    

一._score字段

存储的原始数据。_source中的内容就是搜索api返回的内容,如:

默认情况下,Elasticsearch里面有2份内容,一份是原始文档,也就是_source字段里的内容,我们在Elasticsearch中搜索文档,查看的文档内容就是_source中的内容。另一份是倒排索引,倒排索引中的数据结构是倒排记录表,记录了词项和文档之间的对应关系。

https://www.cnblogs.com/wangzhuxing/p/9527151.html#_label1_2

二.index字段

index使用倒排索引存储的是,分析器分析完的词和文档的对应关系。如图:

文档索引到Elasticsearch的时候,默认情况下是对所有字段创建倒排索引的(动态mapping解析出来为数字类型、布尔类型的字段除外),某个字段是否生成倒排索引是由字段的index属性控制的,在Elasticsearch 5之前,index属性的取值有三个:

Index:定义字段分词以及创建索引(只有建立索引,才能被检索)

no:字段不建立索引,不被检索,无法通过检索查询到该字段。反过来,有些业务要求某些字段不能被搜索,那么index属性设置为no即可。

not_analyzed:字段值不分词,会将整个字段原样写入索引。反过来,如果某些字段需要完全匹配,比如人名、地名,index属性设置为not_analyzed为佳。

analyzed:字段被索引,会做分词会通过默认的standard分析器进行分词,可搜索。反过来,如果需要根据某个字段进搜索,index属性就应该设置为analyzed。

ES6.3 index属性支持false和true,false不能搜索相当于no,true可以索引默认使用standar分词,属性指定字段是否索引,不索引也就不可搜索

 

三.store字段

默认为no,被store标记的fields被存储在和index不同的fragment中,以便于快速检索。虽然store占用磁盘空间,但是减少了计算。store的值可以取yes/no或者true/false,默认值是no或者false。

如果在{"store":yes}的情况下,ES会对该字段单独存储倒排索引,每次根据ID检索的时候,会多走一次IO来从倒排索引取数据。

而如果_source enabled 情况下,ES可以直接根据Client类来解析_source JSON,只需一次IO就将所有字段都检索出来了。

如果需要高亮处理,这里就要说到store属性,store属性用于指定是否将原始字段写入索引,默认取值为no。如果在Lucene中,高亮功能和store属性是否存储息息相关,因为需要根据偏移位置到原始文档中找到关键字才能加上高亮的片段。在Elasticsearch,因为_source中已经存储了一份原始文档,可以根据_source中的原始文档实现高亮,在索引中再存储原始文档就多余了,所以Elasticsearch默认是把store属性设置为no。

注意:如果想要对某个字段实现高亮功能,_source和store至少保留一个。

默认情况下提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可。

独立存储某个字段,在频繁使用某个特殊字段时很常用。而且获取独立存储的字段要比从_source中解析快得多,而且额外你还需要从_source中解析出来这个字段,尤其是_source特别大的时候。

不过需要注意的是,独立存储的字段越多,那么索引就越大;索引越大,索引和检索的过程就会越慢....

一个字段

es中默认的设置_source是enable的,存储整个文档的值。这意味着在执行search操作的时候可以返回整个文档的信息。如果不想返回这个文 档的完整信息,也可以指定要求返回的field,es会自动从_source中抽取出指定field的值返回(比如说highlighting的需求)。

你可以指定一些字段store为true,这意味着这个field的数据将会被单独存储。这时候,如果你要求返回field1(store:yes),es会分辨出field1已经被存储了,因此不会从_source中加载,而是从field1的存储块中加载。

哪些情形下需要显式的指定store属性呢?大多数情况并不是必须的。从_source中获取值是快速而且高效的。如果你的文档长度很长,存储 _source或者从_source中获取field的代价很大,你可以显式的将某些field的store属性设置为yes。缺点如上边所说:假设你存 储了10个field,而如果想获取这10个field的值,则需要多次的io,如果从_source中获取则只需要一次,而且_source是被压缩过 的。

如果对某个field做了索引,则可以查询。如果store:yes,则可以展示该field的值。

如果对某个field做了索引,则可以查询。如果store:no,则可以展示该field的值(从_source字段里面保存了一份原始文,从_source中获得

如果对某个field做了索引,则可以查询。一个store设置为no 的field,如果_source被disable,则只能检索不能展示

如果对某个field没有做索引(index=no),则不可以查询。如果store=no或者store=yes,则均无法显示该字段。

默认情况下,index=true,strore=no,也就是说,字段默认自动是被索引的也可以搜索(index=true),但是不存储(strore=no),这也没关系,因为_source字段里面保存了一份原始文档。

https://blog.csdn.net/liyantianmin/article/details/52531310

https://www.cnblogs.com/wangzhuxing/p/9527151.html#_label1_2

 

182 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传