推广 热搜: page  红书  数据  小红  考试  论文  数据分析  关键词  哪些  搜索 

elasticsearch mapping常用配置

   日期:2024-12-31     移动:https://sicmodule.kub2b.com/mobile/quote/17269.html

最近想整理下mapping的参数,感觉设计mapping时,那些还是挺重要的。

字段类型这次暂时不整理了,可以看。

下面的语句可以在没有创建Index的情况下执行,它执行完后,会自动创建Index。

当然也可以先创建Index,同时设置Index的Settings,然后再执行下面语句创建Mapping。

如果要后加新的字段,可以按如下格式

对于文档的mapping,一旦创建好,是不能直接修改字段的mapping的。

工作中一般有2种方法

  1. 将数据导出备份,然后删除Index,重新创建mapping,再恢复导入数据

  1. 创建新的Index,并设置好新的mapping,用reindex把数据导入新的index

查看index的整个mapping

查看个别字段的mapping

analyzer定义文本字段的分词器,默认在文档的索引和查询时都会用到。

ES本身自带了很多分词器,但多为适合英语。如果要对中文分词,推荐安装ik分词器

例如下面,title字段用es自带的standard。content用ik分词的ik_smart。

用_analyze可以测试分词器对文本的处理。

boost 参数可以设置字段的权重。

其实从ES5.0就不建议在定义mapping的时候就设置boost,因为mapping设置后不方便修改。

建议在查询语句的时候加boost。

coerce:是否开启自动数据类型转换功能, 默认是true(开启)

例如:

  • 字符串"10"自动转数字10

  • 浮点数10.0自动转整型10

实验: 创建一个index

field_one默认coerce为true

field_two设置coerce为false

copy_to这个属性,可以将多个字段的值,复制到同一个字段中。但是这个复制后的字段在_source中不存在,想当一个虚拟的字段。

返回的_source里不存在full_name

可以根据copy_to的字段进行检索

  • 在ES保持文档,构建倒排索引的同时doc_values就被生成了, doc_values数据太大时, 它存储在电脑磁盘上.

  • doc_values是列式存储结构, 它擅长做聚合和排序

  • 对于非分词字段, doc_values默认值是true(开启的), 如果确定某字段不参与聚合和排序,可以把该字段的doc_values设为false

  • 例如SessionID, 它是keyword类型, 对它聚合或排序毫无意义, 需要把doc_values设为false, 节约磁盘空间

  • 分词字段不能用doc_values

创建index, session_id的doc_values为false

对session_id进行检索

测试对session_id排序

测试对session_id聚合

dynamic:是否允许根据文档动态添加mapping类型,默认true(允许)。

如果文档有个字段是object类型,这个object有哪些字段,一开始是不知道的,允许添加文档时,动态的生成它内部的字段。

添加一个mapping,其中social_networks字段是动态的。

插入一个文档

eager_global_ordinals:是否开启预加载全局序号,加快查询,默认false不开启。

此参数只支持text和keyword,keyword默认有eager_global_ordinals参数,而text需要设置fielddata属性。

因为Elasticsearch 是默认延迟加载fielddata到内存里的。当elasticsearch第一次遇到一个查询需要一个指定field的fielddata的时候,就会把索引的每个段中整个field加载到内存。

对于小段,这是个可以忽略不计的时间,但是如果你有一些非常大的fielddata到内存里,这个过程需要数十秒,习惯于秒内响应时间的用户会被网突如其来的迟钝所打击。

对于上面慢的问题新版有2个优化方法

  1. 预加载FieldData

  1. 预加载Global Ordinals(全局序号)

这里说的eager_global_ordinals参数就是第二种方法。

  • enabled参数只用于object类型,默认值是true(开启)

  • 为true时,ES会object里的所有字段进行索引操作, 这样就可以根据该字段检索文档

  • 为false时,ES不去解析object里的字段,不会索引每个字段

  • 当只需要返回该字段用于展示,而不需要索引某个字段时(例如session信息,我们很少用session作为查询条件),可设置enabled=false

  • 设置enabled=false的字段可以存任意类型的值, 包括JSON对象

插入多种格式的值

在enable=false的字段上检索文档, 是查询不到数据的

format是日期字段,设置日期格式的,多个格式用||隔开。

date的格式可以被指定的,如果没有特殊指定,默认格式是"strict_date_optional_time||epoch_millis"。

epoch_millis就是从开始纪元(1970-01-01 00:00:00 UTC)开始的毫秒数-长整型。

ignore_above是在keyword类型下设置一个长度,当字符的长度超过ignore_above的值,那么它不会被索引。

首先随意往ES插一条数据

查看ES自动生成的mapping,name是text类型,其下还有子类型keyword,且"ignore_above" : 256

对于keyword类型, 可设置ignore_above限定字符长度。超过 ignore_above 的字符会被存储,但不会被倒排索引。比如ignore_above=4,”abc“,”abcd“,”abcde“都能存进ES,但是不能根据”abcde“检索到数据。

【1】创建一个keyword类型的字段,ignore_above=4

【2】向索引插入3条数据

此时ES倒排索引是

返回结果

【4】根据”abcde“进行term精确查询,结果为空

通过上面结果能知道”abcde“已经存入ES,也可以搜索出来,但是不存在词项”abcde“,不能根据”abcde“作为词项进行检索。

对于已存在的keyword字段,其ignore_above子属性可以修改,但只对新数据有效。

ignore_malformed 可以忽略不规则的数据,该参数默认为 false。

  • index默认是true

  • 当设置为false,表明该字段不能被被检索, 不构建倒排索引,如果查询会报错。但是可以被store。

  • 如果对字段进行term、terms 查询,聚合(aggregations)操作,脚本(script)操作以及用来排序(sort), 需要设为true。

  • 和上面enabled有区别, index不能用在object类型上, enabled只能用在object类型上
    实验: 创建一个索引, 其中words字段index=false

查询文档, _source是有words的

在index=false的字段上检索文档

该查询会报错:

index_options 控制索引时哪些信息被存储到倒排索引中(用在 text 字段中,有四种取值

fields 参数可以让同一字段有多种不同的索引方式。

最常见的就text类型下面有个keywrod,这样可以用text下的keyword进行term 查询。

normalizer 参数用于解析前(索引或者查询)的标准化配置。

比如,在 es 中,对于一些我们不想切分的字符串,我们通常会将其设置为 keyword,搜索时候也是使用整个词进行搜索。如果在索引前没有做好数据清洗,导致大小写不一致,此时,我们就可以使用 normalizer 在索引之前以及查询之前进行文档的标准化。

  • 不分词的字段,默认 false

  • Norms 存储各种用于在查询时计算查询条件的相关性得分的标准化因子。

  • 虽然norms 在计算相关性得分时非常有用, 但是同样需要消耗大量内存。

  • norms 的配置应该在字段和 索引的设置上保持一致

在 es 中,值为 null 的字段不索引也不可以被搜索,null_value 可以让值为 null 的字段显式的可索引、可搜索。

但是在工作中,null_value基本不用,因为在公司的环境中,人员水平参差不齐,各个项目组要通知知晓和维护这个null_value太难了。所以要用null_value得非常慎重,最好不用,不要去挖坑给后人。

对于null_value 易造成的混乱,看下面代码体会吧。

之前第一个analyzer,它定义文本字段的分词器,默认在文档的索引和查询时都会用到。

而search_analyzer是在查询时,先对要查询的text类型的输入做分词,再去倒排索引搜索。

如果想要让 索引 和 查询 时使用不同的分词器,ElasticSearch也是能支持的,只需要在字段上加上search_analyzer参数

store默认false,如果设置为ture,那就会在_source的同级外面单独存下它原始值,就是不拆成词项的值。一般是_source中某个字段的值很大,但是要查询个别小的字段而查询_source是效率低的,如果把小的字段在_source外面也存一份,如果单独取它时,可以直接从store里取,而不用从_source中取。

term_vectors 是通过分词器产生的信息,包括

一组 terms

每个 term 的位置

term 的首字符/尾字符与原始字符串原点的偏移量

设置term_vector

要查看term_vectors的信息,可以如下

本文地址:https://sicmodule.kub2b.com/quote/17269.html     企库往 https://sicmodule.kub2b.com/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


0相关评论
相关最新动态
推荐最新动态
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号