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

原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/12092298.html

时间: 2024-08-30 18:10:54

Elasticsearch:fielddata 介绍的相关文章

ElasticSearch入门介绍之安装部署(二)

散仙,在上篇文章对ElasticSearch整体入门作了个介绍,那么本篇我们来看下,如何安装,部署es,以及如何安装es的几个比较常用的插件. es的安装和部署,是非常简单方便的,至少这一点散仙在es和solr之间,能够很明显的体现出来,solr的安装是需要依赖servlet容器,比如jetty,或者tomcat等,在下载完毕后,需要拷贝solr的安装部分到web容器里,然后稍作配置,即可启动访问,提供检索服务,当然solr也是非常简单易学的. es目前最新的版本是1.4.2,散仙使用的版本是1

ElasticSearch入门介绍之会当凌绝顶(一)

ElasticSearch也是一款非常优秀的开源的全文检索框架,以大名鼎鼎的Apache Lucene为基础,高度封装了更丰富,易用的API,同时与Apache Solr一样,提供了非常强大的分布式集群功能! 有不懂ElasticSearch(下文简称es)是干啥的朋友,可以点此链接在百科上先大致了解下.  下面进入正题,本篇散仙先从宏观上介绍es的一些概念和特性,让大家能够对es整体有个认识,后续,散仙会写一些怎么安装,部署,调优,使用,集群等 es和lucene,solr一样,都是无模式的基

ElasticSearch 入门介绍

tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词全文检索允许用户输入一些关键字,从数据层中查找到所需要的信息 全文检索和数据库"LIKE"语句相比,远比数据库的开销小,因为检索过程全部从通过检索文件完成,因此效率非常高. 在全文检索领域,用户输入的搜索信息叫做关键字,而全文检索系统把海量信息按照这些关 键字进行结构化处理,把文章打散成段落.文字,最后,按关键字对文章的数据进

Elasticsearch - 简单介绍

Elasticsearch 简介 1. 什么是 Elasticsearch ElasticSearch 是一个基于 Lucene 的搜索服务器. 它了一个分布式多 用户能力的全文搜索引擎,能够达到实时.稳定.可靠.快速搜索. 也可以看做 是布式的实时文件存储,每个字段都能被索引并可被搜索. 目前大多数公司把 elasticsearch 作为 elk 日志系统中日志数据储存和实时 搜索工具. 这一部分用户,他们注重的是数据的实时写入,在大量日志数据产生 时,不堆积. 另一部分公司,把 elasti

Elasticsearch系统学习(一)-elasticsearch简单介绍和核心概念

一.ES简单介绍 1.1.es功能 (1)分布式的搜索引擎和数据分析引擎 搜索:百度,网站的站内搜索,IT系统的检索 数据分析:电商网站,最近7天牙膏这种商品销量排名前10的商家有哪些:新闻网站,最近1个月访问量排名前3的新闻版块是哪些 分布式,搜索,数据分析 (2)全文检索,结构化检索,数据分析 全文检索:我想搜索商品名称包含牙膏的商品,select * from products where product_name like "%牙膏%" 结构化检索:我想搜索商品分类为日化用品的

分布式ElasticSearch简单介绍

这里我们解释一些通用的术语,比如集群(cluster).节点(node)和分片(shard).Elasticsearch的扩展机制,以及它怎样处理硬件故障.在此将探索怎样创建你的集群(cluster).节点(node)和分片(shards),使其依照你的需求进行扩展.并保证在硬件故障时数据依然安全. 一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,它们具有同样的cluster.name.它们协同工作,分享数据和负载. 当增加新的节点或

Elasticsearch简单介绍

如何对站内的数据进行检索? ElasticSearch是比较著名的一个分布式检索解决方案.传统的数据库例如mysql,oracle等,对一个关键词进行检索通常都是采用like的匹配,对性能或者数据量的限制很大.面对上亿,上百亿的数据进行检索时,传统数据库显得力不从心,因此ElasticSearch变成一个不错的选择. ES工作原理 当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接.这个过程如下图所示:

ElasticSearch搜索介绍四

ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, "timed_out": false, "_shards": { "total": 16, "successful": 16, "failed": 0 }, "hits": { "tota

Elasticsearch文章介绍

1.安装:http://blog.csdn.net/andyzhaojianhui/article/details/751952962.介绍:http://www.jb51.net/article/114215.htmhttp://blog.csdn.net/u014201191/article/details/46508311 原文地址:http://blog.51cto.com/4925054/2083109