Py学习  »  Elasticsearch

PB级数据搜索引擎Elasticsearch学习,请先看这一篇!

javap • 4 年前 • 281 次点击  

上一篇文章说的的有关于Elasticsearch提供的Result fulAPi的CRUD操作的一些命令,下面和大家继续介绍有关Elasticsearch相关的操作!

概述目录

①Elasticsearch索引文档添加
②Elasticsearch索引映射Mappings
③Elasticsearch索引中字段的数据类型
④Elasticsearch状态查询

Elasticsearch 7版本之后

Elasticsearch7版本之后创建索引注意事项:
①索引type属性不能指定
②索引类型默认为 _doc

Elasticsearch索引文档添加

添加

添加一个ID为1的“外部”类型到引中,如下所示

# 给定索引中添加一个域(Filed:name)
$ curl -H "Content-Type:application/json" -XPUT 'http://127.0.0.1:9200/my_index/external/1?pretty' -d '{"name":"我是小明"}'

删除

# 删除指定索引的数据
$ curl -H "Content-Type:application/json" -XDELETE 'http://127.0.0.1:9200/my_index/external/1?pretty'

更新

除了能够创建和查询之外,我们还可以更新文档

# 给定索引进行数据的更新操作
$ curl -H "Content-Type:application/json" -XPOST 'http://localhost:9200/my_index/external/1/_update?pretty' -d '{"name":"我是小红"}'

Elasticsearch索引映射Mappings

Mapping就是索引库中对文档及其包含的字段的存储和索引方式的定义,类似于数据库中的表结构信息。不过es的Mapping比数据库灵活很多,它可以自动识别字段。一般不需要指定Mapping都可以,因为es会自动根据数据格式识别它的类型,但如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加Mapping。Mapping主要作用如下 :
①定义Index下字段名(Field Name)
②定义字段的类型,比如数值型,字符串型、布尔型等
③定义倒排索引的相关配置,比如是否索引、记录postion等
元字段
ES内置的已经准备好可以供用户使用的内置关键字,用户es内部相关操作。元字段有如下几种类型:
①标识元字段(_id, _index, _type)
②来源元资源(_source,_size)
③索引元字段(_all)
④路由元字段(_routing)
⑤其他元字段(_meta)
id
document的唯一标识。它与_index和_type一起,唯一标识和定位一个document。
type
用来标识document属于什么映射类型。该字段在6.0.0中弃用。在Elasticsearch 6.x 版本中创建的索引只能包含单个type。在5.x中创建的含有多个type的索引将继续像以前一样在Elasticsearch 6.x中运行。在Elasticsearch 7.0.0中删除。
index
用来标识document属于哪个index,是一个虚拟字段,不会被添加到索引中。
source
用于存储原始的JSON文档内容,本身不会被索引,但是搜索的时候被返回。如果被禁用,只知道有匹配内容,但是具体内容。
size
存储_source字段占用的字节数。
all
该字段用于在没有指定具体字段的情况下进行模糊搜索,可以搜索全部字段的内容。其原理是将所有字段的内容视为字符串,拼在一起放在一个_all字段上,但这个字段默认可以被分析和索引,但不会被存储。
在Elasticsearch 6.0版本中,_all字段已经被禁用了。若要开启,官方建议是: _all已经不允许使用了,作为替换,可以使用copy_to关键字来创建需要获取的所有字段的内容。
routing
用于将文档路由到指定的分片上。如果不指定routing的值, 默认使用文档的id字段。如果存在父文档则使用其_parent的编号。
可以通过为某些文档都指定相同的路由值,来实现对这些文档的自定义路由功能。
meta
自定义一些自定义的信息存放到这个元字段。
analyzer
指定分析器,对索引和查询都有效
normalizer
用于解析前过滤工作,比如:把所有字符转化为小写。
boost
boost字段用于设置字段的权重,比如,关键字出现在title字段的权重是出现在content字段中权重的2倍,设置mapping如下,其中content字段的默认权重是1。
推荐在查询时指定boost,第一中在mapping中写死,如果不重新索引文档,权重无法修改,使用查询可以实现同样的效果。
coerce
coerce属性用于清除脏数据,coerce的默认值是true。整型数字5有可能会被写成字符串"5"或者浮点数5.0。coerce属性可以用来清除脏数据:
①字符串会被强制转换为整数
②浮点数被强制转换为整数
mapping中指定age字段是integer类型,虽然插入的数据类型是String,但依然可以插入成功。salary字段关闭了coerce,因此插入失败。
copy_to
copy_to属性用于配置自定义的_all字段(多个字段合并成一个超级字段)。比如,first_name和last_name可以合并为full_name字段。
doc_values
doc_values是为了加快排序、聚合操作,在建立倒排索引的时候,额外增加一个列式存储映射,是一个空间换时间的做法。默认是开启的,对于确定不需要聚合或者排序的字段可以关闭。
text字段不支持doc_values。
dynamic
dynamic属性用于检测新字段,有三个选项:
①true:新发现的字段自动添加到映射中
②false:新发现的字段被忽略,必须显式添加字段
③strict:如果检测到新字段,抛出异常并拒绝添加文档。
enabled
ES默认会索引所有的字段。但是enabled为false的字段,ES会跳过字段的内容,不可以被搜索,可以从_source字段中获取内容。
fielddata
多数字段在索引时生成doc_values,但是text字段不支持doc_values。
取而代之,text字段在查询时会生成一个fielddata的数据结构,fielddata在字段首次被聚合、排序、或者使用脚本的时候生成。ES通过读取磁盘上的倒排记录表重新生成文档词项关系,最后在Java堆内存中排序。
text字段的fielddata属性默认是关闭的,开启fielddata非常消耗内存。在你开启text字段以前,想清楚为什么要在text类型的字段上做聚合、排序操作。大多数情况下这么做是没有意义的。
format
format属性主要用于格式化日期
ignore_above
ignore_above用于指定字段索引和存储的长度最大值,超过最大值的会被忽略
mapping中指定了ignore_above字段的最大长度为15,文档种的字段大于15,因此不索引,查询是也无法返回该条记录。
ignore_malformed
ignore_malformed可以忽略不规则数据。给一个字段索引不合适的数据类型发生异常,导致整个文档索引失败。如果ignore_malformed参数设为true,异常会被忽略,出异常的字段不会被索引,其它字段正常索引。
include_in_all
include_in_all属性用于指定字段是否包含在_all字段里面,默认开启。
如:title 和 content 字段包含在 _all 字段里,date不包含。
include_in_all也可用于字段级别,如my_type下的所有字段都排除在_all字段之外。
index
index属性指定字段是否索引,不索引就不可搜索,值可以为true或者false。
index_options
index_options控制索引时存储哪些信息到倒排索引中,接受以下配置:
①docs 只存储文档编号
②freqs 存储文档编号和词项频率
③positions 文档编号、词项频率、词项的位置被存储,偏移位置可用于临近搜索和短语查询
④offsets 文档编号、词项频率、词项的位置、词项开始和结束的字符位置都被存储,offsets设为true会使用Postings highlighter
fields
出于多领域应用的目的,以不同的方式对同一字段建立索引通常很有用。例如,一个string 字段可以映射为text用于全文搜索的字段,也可以映射为keyword用于排序或聚合的字段。
null_value
值为null的字段不被索引也不可以搜索,null_value参数可以让值为null的字段显式的可索引、可搜索。
position_increment_gap
为了支持近似或者短语查询,text字段被解析的时候会考虑此项的位置信息。
similarity
similarity参数用于指定文档评分模型,参数有三个:
①classic :TF/IDF评分模型
②boolean:布尔评分模型
③BM25 :ES和Lucene默认的评分模型
default_field自动使用BM25评分模型,classic_field使用TF/IDF经典评分模型,boolean_sim_field使用布尔评分模型。
search_analyzer
大多数情况下索引和搜索的时候应该指定相同的分析器,确保query解析以后和索引中的词项一致。但是有时候也需要指定不同的分析器,例如使用edge_ngram过滤器实现自动补全。
默认情况下查询会使用analyzer属性指定的分析器,但也可以被search_analyzer覆盖。
properties
Object类型或者nested类型,因为有层级嵌套,所以我们可以通过properties来指定这种层级嵌套关系。
store
默认情况下,字段被索引也可以搜索,但是不存储,因为_source字段里面保存了一份原始文档。在某些情况下,比如一个文档里面有title、date和超大的content字段,如果只想获取title和date。
term_vector
词向量包含了文本被解析以后的以下信息:
①词项集合
②词项位置
③词项的起始字符映射到原始文档中的位置。
term_vector参数有以下取值:

参数 解释
yes 只存储词项集合
with_positions 存储词项和词项位置
with_offsets 词项和字符偏移位置
with_positions_offsets 存储词项、词项位置、字符偏移位置

e·g·

# 创建一个name为text的域,并且分词类型采用IK的粗粒度分词
$ curl -H "Content-Type:application/json" -XPUT 'http://localhost:9200/my_index4' -d '{"mappings":{"properties":{"name":{"type":"text","analyzer":"ik_max_word"}}}}'
# ik分词器有两种类型一种是ik_max_word :粗粒度分词(多分)一种是: ik_smart:细粒度分词

动态Mapping

ES中有一个非常重要的特性——动态映射,即索引文档前不需要创建索引、类型等信息,在索引的同时会自动完成索引、类型、映射的创建。映射就是描述字段的类型、如何进行分析、如何进行索引等内容。
ES在文档中碰到一个以前没见过的字段时,它会利用动态映射来决定该字段的类型,并自动地对该字段添加映射。这个可以通过dynamic属性去控制,dynamic属性为false会忽略新增的字段、dynamic属性为strict会抛出异常。如果dynamic为true的话,es会自动根据字段的值推测出来类型进而确定mapping。
动态模板
通过 dynamic_templates,可以拥有对新字段的动态映射规则拥有完全的控制。可以设置根据字段名称或者类型来使用一个不同的映射规则。
每个模板都有一个名字,可以用来描述这个模板做了什么。同时它有一个 mapping 用来指定具体的映射信息,和至少一个参数(比如 match)用来规定对于什么字段需要使用该模板。
模板的匹配是有顺序的 - 第一个匹配的模板会被使用。

Elasticsearch索引中字段的数据类型

字段数据类型
每个字段都有一个数据type,数据类型主要有以下类型:
①数值型: long integer short float double float half_float scaled_float
②范围型: integer_range, float_rangt, long_range, double_range, date_range, ip_range
③简单型: text, keyword, date, boolean, ip
④复杂型: array, geo, object, nested
text
可以被全文搜索。字段内容会被分析,再生成倒排索引。不能够排序,很少用于聚合。
keyword
keyword类型适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤、排序、聚合,则需要keyword字段类型。keyword类型的字段只能通过精确值搜索到。
date
由于JSON中没有日期类型,所以在Elasticsearch中,日期类型可以是以下几种: 日期格式的字符串、 long类型的毫秒数、 integer的秒数。
object
使用JSON天然的格式来自动推断Object。
array
ES没有专用的数组类型,默认情况下任何字段都可以包含一个或者多个值,但是一个数组中的值要是同一种类型。例如:
①字符数组:[ "one", "two" ]
②整型数组:[1, 3]
③嵌套数组:[1, [2, 3]],等价于[1, 2, 3]
④对象数组:[ { "name": "Mary", "age": 12 }, {"name": "John", "age": 10 }]
binary
binary类型默认不存储也不可以被搜索,接受base64编码的字符串。
ip
ip类型的字段用于存储IPV4或者IPV6的地址。
range
range类型支持: integer_range, float_rangt, long_range, double_range, date_range, ip_range
nested
nested嵌套类型是object中的一个特例,可以让array类型的Object独立索引和查询。
token_count
token_count字段是一个数值字段,但是它接受的是字符串。会对接受的字符串进行分析,然后索引字符串的词数。
geo_point
geo_point 类型的字段接受纬度-经度对,可以使用:
①找出落在指定矩形框、多边形、圆形中的坐标点
②以地理位置 或距中心点的距离汇总文档
③按距离打分
④按距离排序

e·g·

# 创建一个索引,指定当中一个域的数据类型
$ curl -H "Content-Type:application/json" -XPUT 'http://localhost:9200/my_index3' -d '{"mappings":{"properties":{"name":{"type":"text"}}}}'

Elasticsearch状态查询

Rest API 说明
/_cat/allocation 查询磁盘存储信息
/_cat/shards 查询索引分片信息
/_cat/shards/{index} 查询某个索引的分片信息
/_cat/master 查询master节点信息
/_cat/nodes 查询集群节点信息
/_cat/tasks 查询任务信息
/_cat/indices 查询索引信息
/_cat/indices/{index} 查询某个具体索引的信息
/_cat/segments 查询段信息
/_cat/segments/{index} 查询段中的某个索引信息
/_cat/count 查询群集的文档数
/_cat/count/{index} 查询群集中单个索引的文档数
/_cat/recovery 查询索引分片恢复的视图,包括正在进行和先前已完成的恢复。只要索引分片移动到群集中的其他节点,就会发生恢复事件。在快照恢复,复制级别更改,节点故障或节点启动期间可能会发生这种情况。
/_cat/pending_tasks 查询等待中的任务
/_cat/aliases 查询索引的当前配置别名的信息,包括过滤器和路由信息
/_cat/aliases/{alias} 查询索引的当前配置别名的信息,包括过滤器和路由信息
/_cat/thread_pool 查询每个节点的群集范围线程池统计信息。默认情况下,为所有线程池返回活动,队列和拒绝的统计信息。
/_cat/plugins 查询运行插件的每个节点的视图
/_cat/fielddata 查询集群中每个数据节点上fielddata当前正在使用的堆内存量
/_cat/nodeattrs 查询自定义节点属性
/_cat/repositories 查询群集中注册的快照存储库
/_cat/templates 查询现有模板的信息

e·g·

# 集群健康
$ curl -XGET http://localhost:9200/_cat/nodes?v
# 查询现有模板的信息
$ curl -XGET 'http://localhost:9200/_cat/templates'
现有模板
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52998
 
281 次点击