资讯专栏INFORMATION COLUMN

Elasticsearch 索引的映射配置详解

voidking / 2537人阅读

摘要:本文就从的索引映射如何配置开始讲起。信息格式的配置支持为每个字段指定信息格式,以满足通过改变字段被索引的方式来提高性能的条件。


概述

Elasticsearch 与传统的 SQL数据库的一个明显的不同点是,Elasticsearch 是一个 非结构化 的数据库,或者说是一个 无模式 的数据库。Elasticsearch 中数据最重要的三要素当属:索引类型文档,其中索引这个概念非常重要,我们可以粗略地将其类比到传统SQL数据库中的 数据表。本文就从 Elasticsearch 的索引映射如何配置开始讲起。

注: 本文原载于  My Personal Blog,欢迎光临 小站

本文内容脑图如下:文章共1540字,阅读本文大约需要5分钟 !



索引模式映射

创建索引时,可以自定义索引的结构,比如 创建一个保存用户信息数据的 users 索引,其典型的结构如下:

id:唯一表示符

name:姓名

birthday:出生日期

hobby:爱好

为此我们可以创建一个 json 格式的索引模式映射文件:users.json

{
    "mappings" : {
        "user" : {
            "properties" : {
                "id" : {
                    "type" : "long",
                    "store" : "yes"
                },
                "name" : {
                    "type" : "string",
                    "store" : "yes",
                    "index" : "analyzed"
                },
                "birthday" : {
                    "type" : "date",
                    "store" : "yes"
                },
                "hobby" : {
                    "type" : "string",
                    "store" : "no",
                    "index" : "analyzed"
                }
                
            }
        }
    }
}

上面的 json代码意义如下:

创建一个名称为 usersIndex

里面有一个名称为 userType

user 有四个 field

且每个 field 都有自己的 属性 定义

然后我们来执行如下命令来新建一个索引:

curl -X PUT http://47.98.43.236:9200/users -d @users.json

结果如下,索引 users、类型 user、以及 四个字段 都已经顺利插入:

关于字段的 可选类型,有如下几种:

string:字符串

number:数字

date:日期

boolean:布尔型

binary:二进制

ip:IP地址

token_count类型

关于每种类型有哪些 属性,可参考官方文档,由于内容太多,此处不再赘述。



分析器的使用

分析器是一种用于 分析数据 或者按照用户想要的方式 处理数据 的工具,对于 字符串类型 的字段,Elasticsearch 允许用户自定义分析器。

先来自定义一个分析器

{
  "settings" : {
    "index" : {
      "analysis" : {
        "analyzer" : {
          "myanalyzer" : {
            "tokenizer" : "standard",
            "filter" : [
              "asciifolding",
              "lowercase",
              "myFilter"
            ]
          }
        },
        "filter" : {
          "myFilter" : {
            "type" : "kstem"
          }
        }
      }

    }
  },
    "mappings" : {
        "user" : {
            "properties" : {
                "id" : {
                    "type" : "long",
                    "store" : "yes"
                },
                "name" : {
                    "type" : "string",
                    "store" : "yes",
                    "index" : "analyzed",
                    "analyzer" : "myanalyzer"
                },
                "birthday" : {
                    "type" : "date",
                    "store" : "yes"
                },
                "hobby" : {
                    "type" : "string",
                    "store" : "no",
                    "index" : "analyzed"
                }

            }
        }
    }
}

上述 json代码中,用户定义了一个名为 myanalyzer 的分析器,该分析器包含 一个分词器 + 三个过滤器,分别如下:

分词器:standard

过滤器:asciifolding

过滤器:lowercase

过滤器:myFilter(自定义过滤器,其本质是 kstem

再来看如何测试和使用自定义的分析器

可以通过类似如下的 Restful接口来测试 analyze API 的工作情况:

curl -X GET "http://47.98.43.236:9200/users/_analyze?field=user.name" -d "Cars Trains"

可见我们输入的时一行字符串普通"Cars Trains",而输出为:cartrain,这说明短语 "Cars Trains" 被分成了两个词条,然后全部转为小写,最后做了词干提取的操作,由此证明我们上面自定义的分析器已然生效了!



相似度模型的配置

Elasticsearch 允许为索引模式映射文件中的不同字段指定不同的 相似度得分 计算模型,其用法例析如下:

    "mappings" : {
        "user" : {
            "properties" : {
                "id" : {
                    "type" : "long",
                    "store" : "yes"
                },
                "name" : {
                    "type" : "string",
                    "store" : "yes",
                    "index" : "analyzed",
                    "analyzer" : "myanalyzer",
                    "similarity" : "BM25"
                },
                "birthday" : {
                    "type" : "date",
                    "store" : "yes"
                },
                "hobby" : {
                    "type" : "string",
                    "store" : "no",
                    "index" : "analyzed"
                }

            }
        }
    }
上述 json文件中,我们为 name 字段使用了 BM25 这种相似度模型,添加的方法是使用 similarity 属性的键值对,这样一来 Elasticsearch 将会为 name 字段使用 BM25 相似度计算模型来计算相似得分。


信息格式的配置

Elasticsearch 支持为每个字段指定信息格式,以满足通过改变字段被索引的方式来提高性能的条件。Elasticsearch 中的信息格式有如下几个:

default:默认信息格式,其提供了实时的对存储字段和词向量的压缩

pulsing:将 重复值较少字段 的信息列表 编码为词条矩阵,可加快 该字段的查询速度

direct:该格式在读过程中将词条加载到未经压缩而存在内存的矩阵中,该格式可以提升常用字段的性能,但损耗内存

memory:该格式将所有的数据写到磁盘,然后需要FST来读取词条和信息列表到内存中

bloom_default:默认信息格式的扩展,增加了把 bloom filter 写入磁盘的功能。读取时 bloom filter 被读取并存入内存,以便快速检查给定的值是否存在

bloom_pulsingpulsing 格式的扩展,也加入 bloom filter 的支持

信息格式字段(postings_format)可以在 任何一个字段上 进行设置,配置信息格式的示例如下:

    "mappings" : {
        "user" : {
            "properties" : {
                "id" : {
                    "type" : "long",
                    "store" : "yes",
                    "postings_format" : "pulsing"
                },
                "name" : {
                    "type" : "string",
                    "store" : "yes",
                    "index" : "analyzed",
                    "analyzer" : "myanalyzer"
                },
                "birthday" : {
                    "type" : "date",
                    "store" : "yes"
                },
                "hobby" : {
                    "type" : "string",
                    "store" : "no",
                    "index" : "analyzed"
                }

            }
        }
    } 
在该例子之中,我们手动配置改变了 id 字段的信息格式为 pulsing,因此可加快该字段的查询速度。


文档值及其格式的配置

文档值 这个字段属性作用在于:其允许将给定字段的值被写入一个更高内存效率的结构,以便进行更加高效排序搜索。我们通常可以将该属性加在 需要进行排序 的字段上,这样可以 提效

其配置方式是 通过属性 doc_values_format 进行,有三种常用的 doc_values_format 属性值,其含义从名字中也能猜个大概:

default:默认格式,其使用少量的内存但性能也不错

disk:将数据存入磁盘,几乎无需内存

memory:将数据存入内存

举个栗子吧:

    "mappings" : {
        "user" : {
            "properties" : {
                "id" : {
                    "type" : "long",
                    "store" : "yes"
                },
                "name" : {
                    "type" : "string",
                    "store" : "yes",
                    "index" : "analyzed",
          "analyzer" : "myanalyzer"
                },
                "birthday" : {
                    "type" : "date",
                    "store" : "yes"
                },
                "hobby" : {
                    "type" : "string",
                    "store" : "no",
                    "index" : "analyzed"
                },
                "age" : {
                    "type" : "integer",
                    "doc_values_format" : "memory"
                 }
            }
        }
    }
上述 json配置中,我们给类型 user 添加了一个 age 字段,假如我们想对年龄字段进行排序,那么给该字段设置文档值格式的属性是可以提升效率的。


后 记
由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!

My Personal Blog

作者更多的原创文章在此,欢迎观赏

我的半年技术博客之路


长按扫描 下面的 小心心 来订阅 CodeSheep,获取更多 务实、能看懂、可复现的 原创文 ↓↓↓


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/34287.html

相关文章

  • Elasticsearch创建索引流程

    摘要:前言说明本文章使用的版本是在上一篇文章搜索引擎的启动过程中,介绍了的启动过程。由此可知,在启动过程中,创建对象时,初始化了,由其名字可以知道这是用来处理请求的。主分片写入后,即可搜索。 前言 说明:本文章使用的ES版本是:6.7.0 在上一篇文章搜索引擎ElasticSearch的启动过程中,介绍了ES的启动过程。 由此可知,在ES启动过程中,创建Node对象(new Node(env...

    mudiyouyou 评论0 收藏0
  • Elasticsearch 参考指南(目录)

    摘要:为了防止用户覆盖中指定的索引,将此设置添加到文件中默认值为,但当设置为时,将拒绝在请求体中指定的显式索引的请求。所有都是单索引,参数接受单个索引名,或指向单个索引的别名。查询子句的行为取决于它们是用于查询上下文还是过滤器上下文。 Elasticsearch 参考指南 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎,它允许你快速,近实时地存储,搜索和分析大量数据,它通...

    liaosilzu2007 评论0 收藏0
  • Elasticsearch - 索引管理

    摘要:使用事件中的时间戳来生成索引名。限制主分片数量为。为所有类型禁用域。添加这个索引至别名中。删除索引删除指定的索引删除多个索引能够用单个命令来删除所有数据可能会导致可怕的后果。事实上,是一个指向当前真实索引的别名。 创建一个索引 我们已经通过索引一篇文档创建了一个新的索引 。这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射。 索引模板 Elasticsearch 不...

    CHENGKANG 评论0 收藏0
  • elasticsearch概念详解

    摘要:本文主要介绍的一些基本概念,有助于深入理解研究和系统一图胜千言与参照来看添加一条数据紫色箭头所指向的为名称红色箭头所指向的为名称参数后面的整个串为一条数据黄色箭头所指向的串的部分为字段名称蓝色箭头所指向的串的部分为字段值顾名思义,集群由一 本文主要介绍elasticsearch6.0的一些基本概念,有助于深入理解、研究elasticsearch和elk系统 一图胜千言 elastics...

    Airy 评论0 收藏0
  • 分布式搜索elasticsearch配置文件详解

    摘要:分布式搜索配置文件详解的文件夹里面有两个配置文件和,第一个是的基本配置文件,第二个是日志配置文件,也是使用来记录日志的,所以里的设置按普通配置文件来设置就行了。设置配置文件的存储路径,默认是根目录下的文件夹。 分布式搜索elasticsearch配置文件详解 elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,...

    fuchenxuan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<