elasticsearch的_all和_source

_all

_all字段是把所有其它字段中的值,以空格为分隔符组成一个大字符串,然后被分析和索引,但是不存储,也就是说它能被查询,但不能被取回显示。

_all能让你在不知道要查找的内容是属于哪个具体字段的情况下进行搜索,例如:

PUT my_index/user/1 
{
  "first_name":    "John",
  "last_name":     "Smith",
  "date_of_birth": "1970-10-24"
}

GET my_index/_search
{
  "query": {
    "match": {
      "_all": "john smith 1970"
    }
  }
}

_all字段的内容为:”john smith 1970 10 24”

_all字段其实就是一个字符串类型的字段,与其它普通字符串字段有相同的参数,包括:analyzer, term_vectors, index_options, and store。

_all字段在查询时占用更多的CPU和占用更多的磁盘空间,如果确实不需要它可以完全的关闭它或者基于每字段定制。

使用_all字段查询

query_string 和 simple_query_string 查询默认都是查询 _all 字段,除非指定了其它默认字段。

GET _search
{
  "query": {
    "query_string": {
      "query": "john smith 1970"
    }
  }
}
上面的查询也等同于: GET _search?q = john+smith+1970
_all 字段可以被完全的disabled:

type_1中的_all字段是enabled 
type_2中的_all字段是disabled

如果_all字段被disabled,那么query_string 和 simple_query_string就不能使用了,你必须要在配置文件中指定 其它的字段作默认的查询字段:

定制多个_all字段

虽然每个索引/type只有一个_all字段,但是可以通过copy_to参数创建多个定制的_all字段,例如下面将first_name,last_name合并放入full_name字段中:

PUT myindex
{
  "mappings": {
    "mytype": {
      "properties": {
        "first_name": {
          "type":    "string",
          "copy_to": "full_name" 
        },
        "last_name": {
          "type":    "string",
          "copy_to": "full_name" 
        },
        "full_name": {
          "type":    "string"
        }
      }
    }
  }
}

PUT myindex/mytype/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET myindex/_search
{
  "query": {
    "match": {
      "full_name": "John Smith"
    }
  }
}

取回显示_all字段内容

_all 字段并没有被持久化放到 _source 字段中 并且默认它也不会被存储,因此它不能被查询后取回显示。 
有两种方法可以,一种是store _all字段,另一种就是取原始字段内容。

存储 _all 字段

PUT myindex
{
  "mappings": {
    "mytype": {
      "_all": {
        "store": true
      }
    }
  }
}

PUT myindex/mytype/1
{
  "first_name": "John",
  "last_name": "Smith"
}

GET _search?fields=_source,first_name,last_name,_all
{
  "query": {
    "match": {
      "_all": "John Smith"
    }
  }
}

_source

该字段是表述哪些字段用于被获取显示的。经过一次搜索,只有两种情况可以把数据召回显示,一种情况是_source存储所有文档数据(或者存储部分 数据),另外一种是某个字段在mapping中设置store为true。如果_source设置为disable;并且该字段index设置为analyzed或者是not_analyzed并且store设置为false那么该字段可以被索引但是不会被显示。所以如果想获取某字段需要关闭_source,打开某字段的store.

总体区分解释:_all用于控制索引的,可以再不指定某个字段的情况下去索引。_source用于控制显示的,开启表示存储整个文档,获取的时候也是获取整个文档。在映射中,你可以选择压缩文档的_source。这实际上就是整行日志——所以开启压缩可以减小索引大小,而且依赖你的设定,提高性能。经验值是当你被内存大小和磁盘速度限制的时候,压缩源文件可以明显提高速度,相反的,如果受限的是CPU计算能力就不行了。 

默认情况下,除了给你所有的字段分别创建索引,elasticsearch还会把他们一起放进一个叫_all的新字段里做索引。好处是你可以在_all里搜索那些你不在乎在哪个字段找到的东西。另一面是在创建索引和增大索引大小的时候会使用额外更多的CPU。所以如果你不用这个特性的话,关掉它。即使你用,最好也考虑一下定义清楚限定哪些字段包含进_all里。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值