elasticsearch基础知识

elasticsearch基本概念

倒排索引 Inverted index

        倒排索引就是将文档中包含的关键字全部提取处理,然后再将关键字和文档之间的对应关系保存起来,最后再对关键字本身做索引排序。
        用户在检索一个关键字时,先对关键字的索引进行查找,再通过关键字与文档的对应关系找到所在的文档。

和关系型数据库做对比
关系型数据库         elasticsearch
库                           索引(index)
表                           映射类型(mapping type)
数据行                    文档(document)
字段                       文档字段(field)
表结构                   映射(mapping)

elasticsearch 索引是映射类型的容器。一个 Elasticsearch 索引非常像关系型世界的数据库,是独立的大量文档集合。
映射类型现在新版本都是 _doc
文档是 es 中所有可搜索数据的最小单位,比如日志文件中的日志项、一部电影的具体信息等等。
字段相当于关系型数据库中的一个列,有很多的数据类型。
映射定义了每个字段的类型、字段使用的分词器等。
 

数据类型

 

字符串类型

        elasticsearch有很多数据类型,简单的介绍一下字符串类型。
        字符串类型可以被分为text和keyword类型,elasticsearch自动映射数据会把字符串定义为text,还会附加一个keyword类型的字段
text文本数据类型,是用于索引全文值的字段。文本数据类型的字段会被分词,(倒排索引)在索引之前将字符串转换为单个术语的列表。分词过程允许elasticsearch搜索每个全文字段中的单个单词。不具备唯一性的字符串都可以使用text文本数据类型。比如 Watch the game 会被分词 分为 watch the game 三个单词(分词规则不同结果也不同)。
        keyword关键字数据类型,是索引结构化内容的字段。如果使用了keyword,那么这个字段不会被分析,原封不动的按照这个值索引。比如 football match 不会分词 ,会按照football match进行搜索。

 

数组

        不需要特殊配置,一个字段如果被配置为基本数据类型,就是天生支持数组类型的。任何字段都可以有 0 个或多个值,但是在一个数组中数据类型必须一样。

例:

put /wsh-test/_doc/2
{
        “name”: [“Kangkang”,“Maria”],
        “age”:[23,19]
}

 

对象

        JSON 文档是有层次结构的,一个文档可能包含其他文档,如果一个文档包含其他文档,那么该文档值是对象类型,其数据类型是对象。当然ElasticSearch中是没有所谓对象类型的。

例:
put /wsh-test/_doc/object1
{
        “name”: [“Kangkang”,“Maria”],
        “age”:[23,19],
        “from”:{
                “school”:“重庆大学”,
                “city”:“CQ”
        }
}

 

多数据类型

        多数据类型允许使用不同的设置,对同一项数据索引多次。带来的好处就是可以同一文本有多种不同的索引方式,比如一个字符串类型的字段,可以使用 text 类型做全文检索,使用keyword 类型做聚合和排序。我们可以看到 es 的动态映射生成的字段类型里,往往字符串类型都使用了多数据类型。

put /wsh-test/_mapping
{
        “properties”:{
                “name”:{
                        “type”:“text”,
                        “fields”:{
                                “age”:{“type”:“keyword”},
                                “length”:{“type”:“double”}
                        }
                }
        }
}

这里把name字段扩充为了多字段类型,为name新增了两个字段age和length。字段上还有很多参数比如分词器analyzer等。

 

字段参数

 

analyzer

        指定分词器,elasticsearch是一款支持全文检索的分布式存储系统,对于text类型的字段,首先会使用分词器进行分词,然后将分词后的词根一个一个存储在倒排索引中,后面的查询主要就是针对分词后的词根搜索。
        这个参数可以在每一个查询、每个字段、每个索引中使用。
优先级:
①.字段上面定义的分词器最优先
②.索引配置中定义的分词器次之
③.默认分词器standard再次之

 

boost

        权重值,可以提升在查询时的权重,对查询相关性有直接的影响,其默认值为 1.0。其影响范围为词根查询(team query),对前缀、范围查询。5.0 版本后已废止。

 

coerce

        数据不总是我们想要的,由于在转换 JSON body 为真正 JSON 的时候,整型数字5有可能会被写成字符串"5"或者浮点数 5.0,这个参数可以将数值不合法的部分去除。默认为 true。如果设置为false的时候,将“6”赋值给int类型的字段会抛出类型不匹配的异常。

 

copy_to

        copy_to 参数允许您创建自定义的_all 字段。换句话说,多个字段的值可以复制到一个字段中。

 

doc_values

        Doc values 的存在是因为倒排索引只对某些操作是高效的。 倒排索引的优势在于查找包含某个项的文档,而对于从另外一个方向的相反操作并不高效,即:确定哪些项是否存在单个文档里,聚合需要这种次级的访问模式。

        

dynamic

        是否允许动态的隐式增加字段。在执行index api或更新文档API时,对于_source 字段中包含一些原先未定义的字段采取的措施,根据dynamic的取值,会进行不同的操作:
        true,默认值,表示新的字段会加入到类型映射中。
        false,新的字段会被忽略,即不会存入souce字段中,即不会存储新字段,也无法通过新字段进行查询。
        strict,会显示抛出异常,需要新使用put mapping api先显示增加字段映射。

        

eager_global_ordinals

表示是否提前加载全局顺序号。Global ordinals 是一个建立在 doc values和fielddata 基础上的数据结构, 它为每一个精确词按照字母顺序维护递增的编号。每一个精确词都有一个独一无二的编号 并且 精确词 A 小于精确词 B 的编号. Global ordinals 只支持 keyword 和 text 型字段,在 keyword 字段中, 默认是启用的而在 text 型字段中 只有 fielddata 和相关属性开启的状态下才是可用的。

        

enabled

        是否建立索引,默认情况下为 true,es 会尝试为你索引所有的字段,但有时候某些类型的字段,无需建立索引,只是用来存储数据即可。也就是说,ELasticseaech 默认会索引所有的字段,enabled 设为 false 的字段,elasicsearch会跳过字段内容,该字段只能从_source 中获取,但是不可搜。只有映射类型(type)和object 类型的字段可以设置 enabled 属性。

        

fielddata

        为了解决排序与聚合,elasticsearch 提供了doc_values属性来支持列式存储,但 doc_values 不支持 text 字段类型。因为 text 字段是需要先分析(分词),会影响 doc_values 列式存储的性能。
        es为了支持text字段高效排序与聚合,引入了一种新的数据结构(fielddata),
使用内存进行存储。默认构建时机为第一次聚合查询、排序操作时构建,主要存储倒排索引中的词根与文档的映射关系,聚合,排序操作在内存中执行。因此fielddata 需要消耗大量的 JVM 堆内存。一旦 fielddata 加载到内存后,它将永久存在。
        通常情况下,加载 fielddata 是一个昂贵的操作,故默认情况下,text 字段的字段默认是不开启 fielddata 机制。在使用 fielddata 之前请慎重考虑为什么要开启 fielddata。

        

format

        在 JSON 文档中,日期表示为字符串。Elasticsearch 使用一组预先配置的格式来识别和解析这些字符串,并将其解析为 long 类型的数值(毫秒),支持自定义格式,也有内置格式。

        

ignore_above

        ignore_above 用于指定字段索引和存储的长度最大值,超过最大值的会被忽略。

        

ignore_malformed

        ignore_malformed 可以忽略不规则数据,对于 login 字段,有人可能填写的是date类型,也有人填写的是邮件格式。给一个字段索引不合适的数据类型发生异常,导致整个文档索引失败。如果 ignore_malformed 参数设为 true,异常会被忽略,出异常的字段不会被索引,其它字段正常索引。

        

index

        index 属性指定字段是否索引,不索引也就不可搜索,取值可以为 true或者false,缺省为 true。

        

index_options

index_options 控制索引时存储哪些信息到倒排索引中,,用于搜索和突出显示目的。

docs                          只存储文档编号
freqs                          存储文档编号和词项频率。
positions                    文档编号、词项频率、词项的位置被存储
offsets                        文档编号、词项频率、词项的位置、词项开始和结束的字符位置都被存储。

        

fields

        fields 可以让同一文本有多种不同的索引方式,比如一个 String 类型的字段,可以使用 text 类型做全文检索,使用 keyword 类型做聚合和排序。

        

norms

        norms 参数用于标准化文档,以便查询时计算文档的相关性。norms 虽然对评分有用,但是会消耗较多的磁盘空间,如果不需要对某个字段进行评分,最好不要开启 norms。

        

normalizer

        规范化,主要针对 keyword 类型,在索引该字段或查询字段之前,可以先对原始数据进行一些简单的处理,然后再将处理后的结果当成一个词根存入倒排索引中,默认为 null。

        

null_value

        一般来说值为 null 的字段不索引也不可以搜索,null_value 参数可以让值为null 的字段显式的可索引、可搜索。

        

position_increment_gap

        文本数组元素之间位置信息添加的额外值。想要调整这个值,在 mapping 中通过 。position_increment_gap 参数指定间距即可。

        

properties

        Object 或者 nested 类型,下面还有嵌套类型,可以通过 properties 参数指定。

        

search_analyzer

        通常,在索引时和搜索时应用相同的分析器,以确保查询中的术语与反向索引中的术语具有相同的格式,如果想要在搜索时使用与存储时不同的分词器,则使用 search_analyzer 属性指定,通常用于 ES 实现即时搜索(edge_ngram)。

        

similarity

指定相似度算法,其可选值:
BM25                    当前版本的默认值,使用 BM25 算法。
classic                  使用 TF/IDF 算法,曾经是 es,lucene 的默认相似度算法。
boolean                一个简单的布尔相似度,当不需要全文排序时使用,并且分数应该只基于查询条件是否匹配。布尔相似度为术语提供了一个与它们的查询boost相等的分数。

        

store

        默认情况下,字段值被索引以使其可搜索,但它们不存储。这意味着可以查询字段,但无法检索原始字段值。通常这并不重要。字段值已经是_source字段的一部分,该字段默认存储。如果您只想检索单个字段或几个字段的值,而不是整个_source,那么这可以通过字段过滤上下文 source filting context 来实现。在某些情况下,存储字段是有意义的。例如,如果您有一个包含标题、日期和非常大的内容字段的文档,您可能只想检索标题和日期,而不需要从大型_source 字段中提取这些字段,可以将标题和日期字段的 store 定义为 ture。

        

term_vector

Term vectors 包含分析过程产生的索引词信息,包括:
索引词列表
每个索引词的位置(或顺序)
索引词在原始字符串中的原始位置中的开始和结束位置的偏移量。

term vectors 会被存储,索引它可以作为一个特使的文档返回。
term_vector 可取值:
no                                      不存储 term_vector 信息,默认值。
yes                                     只存储字段中的值。
with_positions                    存储字段中的值与位置信息。
with_offsets                        存储字段中的值、偏移量
with_positions_offsets        存储字段中的值、位置、偏移量信息。

        

索引的管理

        
#查询索引

get /_cat/indices

#打开索引 wsh_test是我的索引名

post  /wsh_test/_open

#关闭索引

post  /wsh_test/_close

配置索引

通过settings参数配置索引,索引的所有配置项都用‘index’开头,分为静态和动态设置两种。

静态设置

index.number_of_shards主分片数,默认为 5.只能在创建索引时设置,不能修改。
index.shard.check_on_startup 是否应在索引打开前检查分片是否损坏,当检查到分片损坏将禁止分片被打开。false:默认值;checksum:检查物理损坏;true:检查物理和逻辑损坏,这将消耗大量内存和 CPU;fix:检查物理和逻辑损坏。有损坏的分片将被集群自动删除,这可能导致数据丢失。
index.routing_partition_size 自定义路由值可以转发的目的分片数。默认为 1, 只能在索引创建时设置。此值必须小于 index.number_of_shards。
index.codec 默认使用 LZ4 压缩方式存储数据,也可以设置为best_compression,它使用 DEFLATE 方式以牺牲字段存储性能为代价来获得更高 的压缩比例。

例:
post /wsh_test
{“settings”:{ “index.number_of_shards”:3,“index.codec”:“best_compression” }}

put test1{
“settings”:{ “index.number_of_shards”:3, “index.codec”:“best_compression” }
}

动态设置

通过接口‘_settings’来设置,查询也是通过这个接口进行的。

例:
get /wsh_test/_settings

put /wsh_test/_settings
{
         “refresh_interval”:“2s”
}

常用的配置

index.number_of_replicas 每个主分片的副本数。默认为 1
index.auto_expand_replicas 基于可用节点的数量自动分配副本数量,默认为false(即禁用此功能)
index.refresh_interval执行刷新操作的频率。默认为 1s。可以设置为 -1 以禁用刷新
index.max_result_window 用于索引搜索的 from+size 的最大值。默认为10000
index.blocks.read_only 设置为 true 使索引和索引元数据为只读,false为允许写入和元数据更改
index.blocks.read设置为 true 可禁用对索引的读取操作
index.blocks.write 设置为 true 可禁用对索引的写入操作
index.blocks.metadata 设置为 true 可禁用索引元数据的读取和写入
index.max_refresh_listeners 索引的每个分片上可用的最大刷新侦听器数
index.max_docvalue_fields_search 一次查询最多包含开启 doc_values 字段的个数,默认为 100
index.max_script_fields 查询中允许的最大 script_fields 数量。默认为 32
index.max_terms_count 可以在 terms 查询中使用的术语的最大数量。默认为 65536
index.routing.allocation.enable 控制索引分片分配,All(所有分片)、primaries(主分片)、new_primaries(新创建分片)、none(不分片)
index.routing.rebalance.enable 索引的分片重新平衡机制。all、primaries、 replicas、none
index.gc_deletes文档删除后(删除后版本号)还可以存活的周期,默认为 60s
index.max_regex_length 用于正在表达式查询(regex query)正在表达式长度,默认为 1000

配置映射

elasticsearch为我们提供了一个接口‘_mapping’

#查看wsh_test的映射

get  /wsh_test/_mapping

#查看索引mapping里的 具体字段msg (msg字段名)

get  /wsh_test/_mapping/field/msg
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值