ES 增加字段 映射 解析器

ES 增加字段 映射 解析器,第1张

获取索引

为已经存在的索引添加一个新的字段

对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词

字段索引两次使用不的解析器

为字段配置一个特定的解析器

自定义_all字段

ES通过字段映射中的copy_to参数将值复制到其他字段,在first_name和last_name字段中的值会被拷贝到full_name字段中。first_name和last_name字段的映射和full_name字段的索引方式的无关。full_name字段会从其它两个字段中拷贝字符串的值,然后仅根据full_name字段自身的映射进行索引。

解析器可以在几个级别被指定。ES会依次检查每个级别直到它找到了一个可用的解析器。在索引期间,检查的顺序是这样的:

在搜索期间,顺序稍微有所不同:

最近使用ES时,有一个简单的需求,要求实现按照某个字段实现类似mysql中的like查询。

这里记录下实现方式。

这里java的api使用的是RestHighLevelClient,RestHighLevelClient从字面意思理解就是restful风格的高级别的客户端,底层封装的是一个>

在学习 ES 文档相关 *** 作之前,我们先学习 ES 中常用的字段类型

当一个字段的内容需要被全文检索时,可以使用 text 类型,支持长内容的存储,比如检索文章内容、商品信息等。该类型的字段内容在保存时会被分词器分析,并且拆分成多个词项, 然后根据拆分后的词项生成对应的索引,根据关键字检索时可能会将关键字分词,用分好的词从之前生成的索引中去匹配,进而找到对应的文档。对于 text 类型的字段你可能无法通过指定文本精确的检索到。另外需要注意的是, text 类型的字段不能直接用于排序、聚合 *** 作。这种类型的字符串也称做 analyzed 字符串。

keyword 类型适用于结构化的字段,比如手机号、商品id、用户id等,默认最大长度为256。 keyword 类型的字段内容不会被分词器分析、拆分,而是根据原始文本直接生成倒排索引,所以 keyword 类型的字段可以直接通过原始文本精确的检索到。 keyword 类型的字段可用于过滤、排序、聚合 *** 作。这种字符串称做 not-analyzed 字符串。

ES 中的 date 类型默认支持如下两种格式:

如果我们要存储类似 2020-12-01 20:10:15 这种格式的日期就会有问题,我们可以在创建索引时指定字段为 date 类型以及可以匹配的日期格式:

需要注意的是,如果不主动指定字段类型为 date ,ES 默认使用 text 类型去保存日期的值。

boolean 类型就简单了,有 true 、 false 两个值。

一般情况下,如果可以满足需求,则优先使用范围小的类型,来提高效率。

其实在 ES 中并没有数组类型,但我们却可以按数组格式来存储数据,因为 ES 中默认每个字段可以包含多个值,同时要求多个值得类型必须一致。例如可以按照如下方式指定一个字段的值为数组:

这个其实没什么特别的,由于 ES 中以 JSON 格式存储数据,所以一个 JSON 对象中的某个字段值可以是另一个 JSON 对象。

例如我们可以创建索引时定义一个日期范围的字段类型:

添加文档时可以这样指定字段的值:

最后我们通过一个完整的例子梳理一下这些字段类型,首先创建 blog 索引,并指定相关字段的类型:

然后添加一条文档数据:

上边我们只指定了 publishDate 和 reader_age_range 字段的类型,其它的并未指定。其实在添加文档时,ES 也会根据字段的值动态的推断出它的类型,即动态映射,但这样可能出现推断不符合预期的问题,例如前边说过的日期类型,所以你可以根据实际情况选择是否主动指定字段的类型。

再使用如下请求查看一下文档字段的 mapping 信息:

结果如下:

由于我们未指定 title 字段的类型, ES 自动将其映射成了 text 类型,同时还添加了一个类型为 keyword 的字段:

ES 中常用的字段类型就介绍到这里了。其中 text 和 keyword 可能理解起来比较抽象,但也是重点,后边结合具体的例子就好理解了,分词相关的内容后边也会专门介绍。

41、查询节点

heappercent:堆内存,1/2最大内存-1和31之间取较小的值,高的话就是ES集群负担比较重,解决:关闭一些索引(阈值差不多可以定在80左右)后会释放一部分heappercent,但不会释放diskpercent

rampercent:一直挺高,物理内存的使用情况,Lucene会将闲置的内存都占用做cache,如果有应用使用内存时,cache会被释放出来

cpu:一般不会很高,5以下吧,如果有很多query的话会高,如果一直高释放不掉可能查询语句有问题

noderole:mdimaster  data  i查询接口(可否在节点上查询)

42、查询节点健康状态

43、查询节点

diskpercent显示占用的硬盘空间

44、查询索引

45、查询索引的具体记录信息

46、查询字段是否存在

47、查询指定值的字段是否存在

48、查询并控制返回的记录条数

默认是10,范围为0-10000

49、查询并指定起始位置

410、查询并按指定字段排序

411、模糊查询

412、比较大小查询

413、查询并不显示具体内容

414、包含指定字段

415、组合查询

416、范围查询

417、关闭和打开索引

418、删除符合条件的记录

转发自:>

term 查询是简单查询,接受一个字段名和参数,进行精准查询,类似sql中:

ES中对应的DSL如下:

在ES5x及以上版本,字符串类型需设置为keyword或text类型,根据类型来进行精确值匹配。

当进行精确值查询,可以使用过滤器,因为过滤器的执行非常快,不会计算相关度(ES会计算查询评分),且过滤器查询结果容易被缓存。

bool过滤器组成部分:

当我们需要多个过滤器时,只须将它们置入 bool 过滤器的不同部分即可。

terms是包含的意思,如下:

name包含["奥尼尔","麦迪"]

返回结果:

range查询可同时提供包含(inclusive)和不包含(exclusive)这两种范围表达式,可供组合的选项如下:

类似sql中的范围查询:

ES中对应的DSL如下:

如下sql,age不为null:

ES中对应的DSL如下:

如下sql,age为null:

ES中对应的DSL如下:

注:missing查询在5x版本已经不存在。

匹配包含 not analyzed(未分词分析)的前缀字符:

匹配具有匹配通配符表达式( (not analyzed )的字段的文档。 支持的通配符:

1) 它匹配任何字符序列(包括空字符序列);

2) 它匹配任何单个字符。

请注意,此查询可能很慢,因为它需要遍历多个术语。

为了防止非常慢的通配符查询,通配符不能以任何一个通配符或 开头。

正则表达式查询允许您使用正则表达式术语查询。

举例如下:

注意: 的匹配会非常慢,你需要使用一个长的前缀,

通常类似+通配符查询的正则检索性能会非常低。

模糊查询查找在模糊度中指定的最大编辑距离内的所有可能的匹配项,然后检查术语字典,以找出在索引中实际存在待检索的关键词。

举例:

检索索引test_index中,type为user的全部信息。不过在 es6x 版本,一个index仅有一个type,未来 es7x 版本,将取消type,所以这个查询没啥意义。

返回指定id的全部信息。

全文检索查询,是通过分析器,对查询条件进行分析,然后在全文本字段进行全文查询。

全文搜索取决于mapping中设定的analyzer(分析器),这里使用的是ik分词器。

所以在进行查询开发时候,需要先了解index的mapping,从而选择查询方式。

匹配查询接受文本/数字/日期类型,分析它们,并构造查询。

对查询传入参数进行分词,搜索词语相同文档。

match_phrase查询分析文本,并从分析文本中创建短语查询。

用户已经渐渐习惯在输完查询内容之前,就能为他们展现搜索结果,这就是所谓的即时搜索(instant search) 或输入即搜索(search-as-you-type) 。

不仅用户能在更短的时间内得到搜索结果,我们也能引导用户搜索索引中真实存在的结果。

例如,如果用户输入 johnnie walker bl ,我们希望在它们完成输入搜索条件前就能得到: Johnnie Walker Black Label 和 Johnnie Walker Blue Label 。

match_phrase_prefix与match_phrase相同,除了它允许文本中最后一个术语的前缀匹配。

{索引名},支持支持一次搜索多个索引,多个索引使用逗号分隔,例子:

按前缀匹配索引名:搜索索引名以order开头的索引。

当我们执行查询语句,返回的JSON数据格式如下

query子句主要用来编写类似SQL的Where语句,支持布尔查询(and/or)、IN、全文搜索、模糊匹配、范围查询(大于小于)。

es(1)—基础Rest API命令

es(2)—复杂的多条件查询(bool查询与constant_score查询)

es(4)—查询条件match和term

es(5)—terms的用法

es7x(6)—minimum_should_match最低匹配度

es7x(7)—短语搜索(match_phrase)

es7x(8)— 多字段匹配检索 multi_match query

es7x(9)— match query的参数

aggs子句,主要用来编写统计分析语句,类似SQL的group by语句

es7x(10)aggs聚合查询

sort子句,用来设置排序条件,类似SQL的order by语句。

ES的默认排序时根据相关性分数排序,如果我们想根据查询结果中的指定字段排序,需要使用 sort 关键字处理。

语法:

sort子句支持多个字段排序,类似SQL的order by。

例子:

查询order_v2索引的所有结果,结果根据order_no字段降序,order_no相等的时候,再根据shop_id字段升序排序。

ES查询的分页主要通过from和size参数设置,类似MYSQL 的limit和offset语句。

_source用于设置查询结果返回什么字段,类似select语句后面指定字段。

仅返回,order_no和shop_id字段。

以上就是关于ES 增加字段 映射 解析器全部的内容,包括:ES 增加字段 映射 解析器、ES实现模糊搜索、Elasticsearch 字段类型等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9635394.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存