Elasticsearch:fielddata 介绍
默认情况下,大多数字段都已编入索引,这使它们可搜索。 但是,脚本中的排序,聚合和访问字段值需要与搜索不同的访问模式。
搜索需要回答“哪个文档包含该术语?”这个问题,而排序和汇总则需要回答一个不同的问题:“此字段对该文档的值是什么?”。
大多数字段可以将索引时生产的磁盘doc_values(https://www.elastic.co/guide/en/elasticsearch/reference/current/doc-values.html)用于此数据访问模式,但是文本(text)字段不支持doc_values。
替代的方案,文本(text)字段使用查询时内存中的数据结构,称为fielddata。 当我们首次将该字段用于聚合,排序或在脚本中使用时,将按需构建此数据结构。 它是通过从磁盘读取每个段的整个反向索引,反转术语︎文档关系并将结果存储在JVM堆中的内存中来构建的。
Fielddata针对text字段在默认时是禁用的
Fielddata会占用大量堆空间,尤其是在加载大量的文本字段时。 一旦将字段数据加载到堆中,它在该段的生命周期内将一直保留在那里。 同样,加载字段数据是一个昂贵的过程,可能导致用户遇到延迟的情况。 这就是默认情况下禁用字段数据的原因。
假如我们创建一个如下的myindex的索引:
    PUT myindex
    {
      "mappings": {
        "properties": {
          "address": {
            "type": "text"
          }
        }
      }
    }
    PUT myindex/_doc/1
    {
      "address": "New York"
    }
如果您尝试对文本字段中的脚本进行排序,汇总或访问值:
    GET myindex/_search
    {
      "size": 20,
      "aggs": {
        "aggr_mame": {
          "terms": {
            "field": "address",
            "size": 5
          }
        }
      }
    }
则会看到以下异常:

显然,我们不能对text字段进行聚合处理。那么我们该如何处理这个问题呢?
我们的一种方法就是在配置mapping的时候加入"fielddata"=true这个选项。我们来重新对我们的myindex的mapping进行配置:
    DELETE myindex
    PUT myindex
    {
      "mappings": {
        "properties": {
          "address": {
            "type": "text",
            "fielddata": true
          }
        }
      }
    }
    PUT myindex/_doc/1
    {
      "address": "New York"
    }
    GET myindex/_search
    {
      "size": 0,
      "aggs": {
        "aggr_mame": {
          "terms": {
            "field": "address",
            "size": 5
          }
        }
      }
    }
在这里,我们尽管还是把address这个字段设置为text,但是由于我们加入了"fielddata"=true,那么我们,我们就可以对这个项进行统计了。

与简单的搜索操作不同,排序和聚合需要能够发现在特定文档的特定字段中可以找到哪些术语。 对于这些任务和其他任务,必须具有与Elasticsearch(反向)索引相反的数据结构。 这就是fielddata的目的。
细心的开发者,如果这个时候去Kibana创建一个以myindex为索引的index pattern,我们可以发现:

我们的address字段变为aggregatable,也就是说我们可以对它进行做聚合分析尽管它没有doc_values。
在启动fielddata之前
在启用fielddata之前,请考虑为什么将文本字段用于聚合,排序或在脚本中使用。 这样做通常没有任何意义。
在索引之前会分析文本字段,以便可以通过搜索new或york来找到类似New York的值。 当您可能想要一个名为New York的存储桶时,此字段上的术语汇总将返回一个叫做new存储桶和一个叫做york存储桶。
相反,您应该有一个用于全文搜索的文本字段,以及一个为聚合启用doc_values的未分析的keyword字段,如下所示:
    DELETE myindex
    PUT myindex
    {
      "mappings": {
        "properties": {
          "address": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
这样,我们可以使用address来做全文的搜索,而address.keyword被用来做aggregations, sorting 及在脚本中使用。
参考:
【1】https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html
【2】https://qbox.io/blog/field-data-elasticsearch-cluster-instability
Elasticsearch:fielddata 介绍的更多相关文章
- 第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装
		
第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装 elasticsearch(搜索引擎)介绍 ElasticSearch是一个基于 ...
 - 三十八  Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装
		
elasticsearch(搜索引擎)介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ...
 - 全文搜索引擎Elasticsearch详细介绍
		
我们生活中的数据总体分为两种:结构化数据 和 非结构化数据. 结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理.指具有固 ...
 - Elasticsearch - 简单介绍
		
Elasticsearch 简介 1. 什么是 Elasticsearch ElasticSearch 是一个基于 Lucene 的搜索服务器. 它了一个分布式多 用户能力的全文搜索引擎,能够达到实时 ...
 - ElasticSearch搜索介绍四
		
ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, &quo ...
 - ElasticSearch入门介绍一
		
ElasticSearch 关于es的几个概念: 集群:多个运行es节点可以组成一个集群,它们拥有相同的cluster.name. 节点:运行es的实例 索引:相当于数据库database,一个集群可 ...
 - 〈一〉ElasticSearch的介绍
		
目录 什么是ElasticSearch 核心能力 ES的搜索核心 搜索引擎选择 搜索的处理 补充: 小节总结: 基本学习环境搭建 如何操作ElasticSearch 下载.安装和运行(Based Wi ...
 - Docker部署ELK 7.0.1集群之Elasticsearch安装介绍
		
elk介绍这里不再赘述,本系列教程多以实战干货为主,关于elk工作原理介绍,详情查看官方文档. 一.环境规划 主机名 IP 角色 节点名 centos01 10.10.0.10 es node-10 ...
 - Elasticsearch 术语介绍和CRUD实际操作入门
		
一.Elastic Stack 核心Elasticsearch Elasticsearch 是一个分布式.RESTful 风格的搜索和数据分析引擎.Elasticsearch 是面向文档的,这就意味着 ...
 
随机推荐
- dolphinscheduler添加hana支持
			
dolphinscheduler添加hana支持 转载请注明出处: https://www.cnblogs.com/funnyzpc/p/16395092.html 前面 上一节有讲datax对han ...
 - SQL练习六--More JOIN operations
			
movie Field name Type Notes id INTEGER An arbitrary unique identifier title CHAR(70) The name of the ...
 - NC20583 [SDOI2016]齿轮
			
题目链接 题目 题目描述 现有一个传动系统,包含了N个组合齿轮和M个链条.每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y. 即如果只考虑这两个组合齿轮,编号为u的齿轮转动x圈,编号为 ...
 - App Inventor拓展项目——钢琴游戏
			
本以为安卓只能写代码开发呢,结果安卓课程是这样一个图形化的开发方式,趣味性强一些吧.这里记录一下自己根据学习内容拓展的这个钢琴游戏. 先简要介绍一下 Android应用开发者(英语:App Inven ...
 - Mysql 数据恢复流程 基于binlog redolog undolog
			
注:文中有个易混淆的地方 sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,同时undolog维护了此事务是否完成的状态. 日志持久化事务,为了保证redolog和 ...
 - 快速新建并配置一个eslint+prettier+husky+commitlint+vue3+vite+ts+pnpm的项目
			
前置准备 一台电脑 vscode pnpm vscode插件:ESLint v2.2.6及以上 vscode插件:Prettier - Code formatter v9.5.0及以上 vscode插 ...
 - CF717 Festival Organization
			
\(CF717\ Festival\ Organization\) Description 一个合法的串定义为:长度在 \([l,r]\) 之间,且只含 \(0,1\),并且不存在连续 \(2\) 个 ...
 - 面试突击75:SpringBoot 有几种读取配置文件的方法?
			
Spring Boot 中读取配置文件有以下 5 种方法: 使用 @Value 读取配置文件. 使用 @ConfigurationProperties 读取配置文件. 使用 Environment 读 ...
 - 【NOI P模拟赛】仙人掌(圆方树,树形DP)
			
题面 n n n 个点, m m m 条边. 1 ≤ n ≤ 1 0 5 , n − 1 ≤ m ≤ 2 × 1 0 5 1\leq n\leq 10^5,n-1\leq m\leq 2\times1 ...
 - ZZH与计数(矩阵加速,动态规划,记忆化搜索)
			
题面 因为出题人水平很高,所以这场比赛的题水平都很高. ZZH 喜欢计数. ZZH 有很多的数,经过统计,ZZH一共有 v 0 v_0 v0 个 0 , v 1 v_1 v1 个 1,-, v 2 ...