适用:email内容、某产品的描述等需要分词全文检索的字段; 不适用:排序或聚合(Significant Terms 聚合例外) keyword类型:无需分词、整段完整精确匹配。 2.7.3 nested嵌套类型 nested嵌套类型是Object数据类型的特定版本,允许对象数组彼此独立地进行索引和查询。 在ElasticSearch内部,嵌套的文档(Nested Documents)被索引为很多独立的隐藏文档(separate documents),这些隐藏文档只能通过嵌套查询(Nested Query 每一个嵌套的文档都是嵌套字段(文档数组)的一个元素。 嵌套文档的内部字段之间的关联被ElasticSearch引擎保留,而嵌套文档之间是相互独立的。 我做的就是上面的工作。 以上,是说给自己的,也与大家共勉!
我们查询时,也仅仅返回那些真正符合条件的文档。 不仅如此,由于嵌套文档直接存储在文档内部,查询时嵌套文档和根文档联合成本很低,速度和单独存储几乎一样。 嵌套文档是隐藏存储的,我们不能直接获取。 如果要增删改一个嵌套对象,我们必须把整个文档重新索引才可以。值得注意的是,查询的时候返回的是整个文档,而不是嵌套文档本身。 嵌套聚合 在查询的时候,我们使用 nested 查询就可以获取嵌套对象的信息。同理, nested 聚合允许我们对嵌套对象里的字段进行聚合操作。 嵌套文档越多,这带来的成本就越大。 查询结果返回的是整个文档,而不仅仅是匹配的嵌套文档。尽管目前有计划支持只返回根文档中最佳匹配的嵌套文档,但目前还不支持。 嵌套文档看似与文档内有一个集合字段类似,但是实则有很大区别,以上面图中嵌套文档为例,留言1,留言2,留言3虽然都在当前文章所在的文档内,但是在内部其实存储为4个独立文档,如下图所示。 ?
Vite学习指南,基于腾讯云Webify部署项目。
在Elasticsearch取消了多个索引内创建多个type的机制,由于场景需要,所以调研了嵌套文档和父子文档 [image] 以文章和文章留言为例,嵌套文档都在一个文档内,而父子文档则分开存储了父文档与子文档 1、嵌套文档 嵌套文档看似与文档内有一个集合字段类似,但是实则有很大区别,以上面图中嵌套文档为例,留言1,留言2,留言3虽然都在当前文章所在的文档内,但是在内部其实存储为4个独立文档,如下图所示。 使用嵌套文档时,文档的分数计算需要注意,参考官方文档的描述: nested 查询肯定可以匹配到多个嵌套的文档。 每一个匹配的嵌套文档都有自己的相关度得分,但是这众多的分数最终需要汇聚为可供根文档使用的一个分数。 默认情况下,根文档的分数是这些嵌套文档分数的平均值。 ,在sort内,又添加了nested_filter来过滤一遍上面嵌套文档的查询条件,原因是这样的,在嵌套文档查询排序时是先按照条件进行查询,查询后再进行排序,那么可能由于数据的原因,导致排序的字段不是按照匹配上的数据进行排序
对象与嵌套的区别在于映射,这会促使ES将嵌套的内部对象索引到邻近的位置,但是保持独立的Lucene文档,如图2所示。在搜索时,需要使用nested过滤器和查询,这些会在Lucene文档中搜索。 ? 例如,根据查询条件的匹配程度,每个内部会员文档会得到自己的得分。但是来自应用的查询是为了查找分组文档,所以ES需要为整个分组文档给出一个得分。在这点上一共有4中选项,通过score_mode设置。 avg:这是默认选项,系统获取所有匹配的内部文档之分数,并返回其平均分。 total:系统获取所有匹配的内部文档之分数,将其求和并返回。 max:返回匹配的内部文档之最大得分。 none:考虑总文档得分的计算时,不保留、不统计嵌套文档的得分。 (4)获知哪些内部文档匹配上了 可以在嵌套查询或过滤器中添加一个inner_hits对象,来展示匹配上的嵌套文档。 ES中的反规范化主要用于处理多对多关系。与嵌套、父子的一对多实现不同,ES无法承诺让多对多关系保持在一个节点内。如图7所示,一个单独的关系可能会延伸到整个数据集。
搜索响应中每个匹配文档中会增加matched_queries结构体,记录该文档匹配的查询名称。查询和筛选器的标记只对bool查询有意义。 name 为内部嵌套层定义的名称。 该部分示例将在下节重点阐述。 field collapsing(字段折叠) 允许根据字段值折叠搜索结果。折叠是通过在每个折叠键上只选择排序最高的文档来完成的。 有点类似于聚合分组,其效果类似于按字段进行分组,默认命中的文档列表第一层由该字段的第一条信息,也可以通过允许根据字段值折叠搜索结果。折叠是通过在每个折叠键上只选择排序最高的文档来完成的。 Search After Elasticsearch支持的第三种分页获取方式,该方法不支持跳转页面。 es的排序查询响应结果中会返回sort数组,包含本排序字段的最大值,下一页查询将该组字段当成查询条件,es在此数据的基础下返回下一批合适的数据。
,若分词中的任意一个词与目标字段匹配上,则可查询到。 , field有通配符忒行 我们要查询的值不知道在哪个字段,所以需要多字段进行匹配,只要有一个字段符合条件,那么就可以匹配出来了 searchSourceBuilder +代表必须含有 -代表不能含有 //查询文档中含必须含有changge,不含有hejiu的文档(会每个字段去查询)+代表必须含有 -代表不能含有 QueryBuilder builder ("jing"); termQuery 精准匹配 字段的值必须是这个才可以查询出来 searchSourceBuilder.query(QueryBuilders.termQuery("name","hong ,也就是获取每个人的成绩和 // 进行查询 SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT
本文主要介绍 Elasticsearch 的聚合功能,介绍什么是 Bucket 和 Metric 聚合,以及如何实现嵌套的聚合。 ;Top Hits 一般用于分桶后获取桶内最匹配的顶部文档列表,即详情数据。 另外,聚合分析还支持嵌套,那么让我们看下如果实现一个嵌套聚合分析: ? 通过这个请求不但可以获取到航班目的地的统计信息,还可以得到航班抵达时的天气状况,运行结果如下所示: ? 下面是我总结的 Elasticsearch 聚合分析的思维导图,在公众号【武培轩】回复【es】获取思维导图以及源代码。 ? 参考文献 Elastic Stack从入门到实践 Elasticsearch核心技术与实战 https://www.elastic.co/guide/en/elasticsearch/reference
它不包含整个搜索请求。shard级日志记录的一些好处是,与请求级日志记录相比,将特定计算机上的实际执行关联起来。 _last\_first 默认情况下,在Elasticsearch中,搜索请求必须访问与查询匹配的每个文档,以检索按指定排序 排序的top文档。 并且只能对应一个字段,不能对应多个 2.在创建别名时,字段field必须同时存在 3.如果定义了嵌套对象,字段别名必须与其目标具有相同的嵌套范围 4.不能应用在索引和更新api上 v object 将整个json对象解析出其字段的值作为关键词,并设置为文档的字段值,在索引期间不会对value 值进行分析和特殊的处理例如日期,这样json对象就可以被搜索和聚合。 词项,这样对于通过部分匹配(partially matches ) 去匹配整个索引值的查询来说是有效的。
ES聚合分为两个主要类别:度量型和桶型。度量型(metric)聚合是指一组文档的统计分析,可以得到诸如最小值、最大值、标准差等度量值。 有了桶聚合,可以嵌套其它的聚合,让子聚合在上层聚合所产生的每个文档桶上运行。ES这种所谓的嵌套聚合可以类比于SQL中的group by后面跟多个字段,但更为灵活。看图1的例子。 ? 聚合总是在所有和查询匹配的结果上执行,因此查询中的from和size参数对于聚合没有影响。 (3)过滤器和聚合 聚合只会在与过滤器查询匹配的文档上运行。 聚合处理的文档集合:如果一篇文档和后过滤器不匹配,它仍然会被聚合操作计算在内。 二、度量集合 度量聚合从不同文档的分组中提取统计数据,这些统计数据通常来自数值型字段。 但是结果桶按照某个分数来排序,该分数代表了前台文档与背景文档之间的百分比差异。前台文档是那些与查询匹配的文档,而背景文档是当前索引中所有的文档。
嵌套字段排序 es还支持在一个或多个嵌套对象内部的字段进行排序。一个嵌套查询提包含如下选项(参数): path 定义要排序的嵌套对象。 为了准确地反映查询逻辑,它在内存中创建一个很小的索引,并通过Lucene的查询执行计划重新运行原来的查询条件,以便获取当前文档的更低级别的匹配信息。 它特别适用于大字段和高亮显示多词根查询(如前缀或通配符),因为它可以访问每个文档的术语字典。 它在内存中创建一个很小的索引,并通过Lucene的查询执行计划重新运行原来的查询条件,以访问当前文档上的低级匹配信息。对于每个需要突出显示的字段和文档,都要重复此操作。 phrase_limit 控制要考虑的文档中匹配短语的数量。防止fvh分析太多的短语和消耗太多的内存。在使用matched_fields时,将考虑每个匹配字段的phrase-_limit短语。
旧版本中使用较多,从ElasticSearch 5.x开始不再支持string,由text和keyword类型替代。 text类型的字段不用于排序,很少用于聚合。 (3)keyword keyword类型适用于索引结构化的字段,比如email地址、主机名、状态码和标签。 比如,某个字段的取值最大值不会超过100,那么选择byte类型即可。迄今为止吉尼斯记录的人类的年龄的最大值为134岁,对于年龄字段,short足矣。字段的长度越短,索引和搜索的效率越高。 对于float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界是 类型 JSON天生具有层级关系,文档会包含嵌套的对象 DELETE test PUT test PUT test/my/1 { "employee":{ "age":30, "fullname
比如,某个字段的取值最大值不会超过100,那么选择byte类型即可。迄今为止吉尼斯记录的人类的年龄的最大值为134岁,对于年龄字段,short足矣。字段的长度越短,索引和搜索的效率越高。 对于float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0, , 直到找到匹配的. 注意: 动态添加数据时, 数组中第一个值的类型决定整个数组的类型; 不支持混合数组类型, 比如[1, "abc"]; 数组可以包含null值, 空数组[]会被当做missing field —— 没有值的字段 - nested 嵌套类型是对象数据类型的一个特例, 可以让array类型的对象被独立索引和搜索. 2.3.1 对象数组是如何存储的 ① 添加数据: PUT game_of_thrones/role/
2、多字段检索 (Multi-field Search) 如我们已经看到的,要在搜索中查询多个文档字段(例如在标题和摘要中搜索相同的查询字符串),请使用multi_match查询。 5、 Fuzzy 模糊检索( Fuzzy Queries) 在 Match检索 和多匹配检索中可以启用模糊匹配来捕捉拼写错误。 基于与原始词的Levenshtein距离来指定模糊度。 6、 Wildcard Query 通配符检索 通配符查询允许您指定匹配的模式,而不是整个词组(term)检索。 ? 匹配任何字符; *匹配零个或多个字符。 默认情况下,这些词必须完全相邻,但您可以指定偏离值(slop value),该值指示在仍然考虑文档匹配的情况下词与词之间的偏离值。 详见 Elasticsearch guide. 18、 Function 得分:衰减函数 假设,我们不是想通过一个字段的值逐渐增加得分,以获取理想的结果。 举例:价格范围、数字字段范围、日期范围。
换句话说,假如有两个映射类型 user 和 tweet,user 类型中的 user_name 字段与 tweet 类型中的 user_name 字段是完全一样的,并且两个 user_name 字段在两个类型中必须具有相同的映射 在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。 这不像其他的搜索引擎,仅仅返回文档的 ID,需要你单独去获取文档。 每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。 默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。 max_score 值是与查询所匹配文档的 _score 的最大值。 pretty 8) 创建映射 概念说明: 在索引中每个文档都包括了一个或多个字段(field),创建映射就是向索引库中创建字段及字段类型等的过程,下面是 document 和 field 与关系数据库的概念的类比
,数据里的类型可以是对象 object 对象类型,文档会包含嵌套的对象 nested 嵌套类型, 他能够保证数据之间的层级结构 索引的基本操作 创建索引, 类似操作mysql的建表语句 PUT film 但由于甄嬛与先故纯元皇后的神似,皇后设计以纯元皇后的礼服陷害甄嬛,父亲(沈保平饰)也被文字狱牵连和奸人陷害而遭牢狱之灾,生下女儿后,心灰意冷的甄嬛选择出宫修行。 , 只要有一个字段满足搜索条件, 就能查询出来, 对于多字段匹配的问题, 涉及到评分, 可以通过type来指定评分标准,有三种类型,分别是: best_fields: 完全匹配的文档占比高, 可以通过tie_breaker 指定评分的系数;most_fields:表示 越多字段匹配的文档评分越; cross_fields: 表示词条的分词词汇是分配到不同字段中评分高。 聚合查询分下面几类 指标聚合 对文档的特定字段(field)或脚本值(generated using scripts),计算最大值(max), 最小值(min), 平均值(avg), 求和(sum
must_not:所有分句都必须不匹配,与 NOT 相同。 should:至少有一个分句匹配,与 OR 相同。 这样就行了!如果你需要多个过滤器,将他们放入 bool 过滤器就行。 <2> 这两个term过滤器在bool查询的must中匹配嵌套,因此必须全部匹配。 因此,term 和 terms 是 必须包含 操作,而不是 必须相等。 完全匹配 假如你真的需要完全匹配这种行为,最好是通过添加另一个字段来实现。在这个字段中,你索引原字段包含值的个数。 当选定一个合适的 null_value 时,确保以下几点: 它与字段的类型匹配,你不能在 date 类型的字段中使用字符串 null_value 它需要能与这个字段可能包含的正常值区分开来,以避免真实值和 你索引中添加了新的文档,只有这些新文档需要被添加到已存的字节集中,而不是一遍遍重新计算整个缓存的过滤器。过滤器和整个系统的其他部分一样是实时的,你不需要关心缓存的过期时间。
,默认不存储,且不可搜索 范围类型 INTERSECTS :默认的匹配模式,只要搜索值与字段值有交集即可匹配到 WITHIN:字段值需要完全包含在搜索值之内,也就是字段值是搜索值的子集才能匹配 CONTAINS Nested nested 类型是一种对象类型的特殊版本,它允许索引对象数组,独立地索引每个对象 嵌套类型与Object类型的区别 通过例子来说明: 插入一个文档,不设置mapping,此时 user 导致这个文档错误地匹配对 alice 和 smith 的查询 如果最开始就把user设置为 nested 嵌套对象呢? ,默认为Null,即空值,此时ES会忽略该值 通过设定该值可以设定字段为 null 时的默认值 ignore_malformed 当数据类型不匹配且 coerce 强制转换时,默认情况会抛出异常,并拒绝整个文档的插入 ,但需要占用大量的磁盘空间 如果不需要计算字段的评分,可以取消该字段 norms 的功能 position_increment_gap 与 proximity queries(近似查询)和 phrase
在很多场景下,我们不仅需要搜索到匹配的结果,还需要能够按照某种方式对搜索结果重新打分排序。例如: •搜索具有某个关键词的文档,同时考虑到文档的时效性进行综合排序。 •搜索某个旅游景点附近的酒店,同时根据距离远近和价格等因素综合排序。•搜索标题包含 elasticsearch 的文章,同时根据浏览次数和点赞数进行综合排序。 3.最终结果的分数 result_score 等于 query_score 与 func_score 按某种方式计算的结果(默认是相乘)。 例如,搜索标题包含 elasticsearch 的文档。 设置为了 max,意思是取两个打分函数的最大值作为 func_score,对应上述假设也就是 2.3 和 42 两者中的最大值,即 func_score = 42 boost_mode 设置为了 multiply 需要注意的是:不论我们怎么自定义打分,都不会改变原始 query 的匹配行为,我们自定义打分,都是在原始 query 查询结束后,对每一个匹配的文档进行重新算分。
内部过滤器的操作 在内部,Elasticsearch 会在运行非评分查询的时执行多个操作: 查找匹配文档:term 查询在倒排索引中查找 XHDK-A-1293-#fJ3 然后获取包含该 term 的所有文档 精确相等 如果一定期望得到我们前面说的那种行为(即整个字段完全相等),最好的方式是增加并索引另一个字段, 这个字段用以存储该字段包含词项的数量,同样以上面提到的两个文档为例,现在我们包括了一个维护标签数的新字段 简单的说,一个倒排索引只是一个 token 列表和与之相关的文档信息,如果字段不存在,那么它也不会持有任何 token,也就无法在倒排索引结构中表现。 其核心实际是采用一个 bitset 记录与过滤器匹配的文档。Elasticsearch 积极地把这些 bitset 缓存起来以备随后使用。 用 term 查询在倒排索引中查找 quick 然后获取一组包含该项的文档,本例的结果是文档:1、2 和 3 。 为每个文档评分 。
前面我们聊了 Elasticsearch 的索引、搜索和分词器,今天再来聊另一个基础内容—— Mapping。 Elasticsearch 支持的字段映射的数据类型在这个文档中,除了这些,其他的类型映射都需要显示的指定了。 match 和 unmatch 这两个比较简单,match 是指匹配到模式的字段, unmatch 是表示不匹配的字段。 除了以上三种之外,其他的就是 match_pattern 用来进行正则匹配,path_match 和 path_unmatch 则是表示字段所在路径的是否匹配。 此外,mapping 的许多字段和参数文中都没有涉及,对于我而言,大部分都是用到了现查文档,不过也还是建议大家看一看文档,起码遇到问题时能知道大概查找文档的一个方向。这样就会比身边人强不少。
腾讯云时序数据库(CTSDB)是一种高效、安全、易用的云上时序数据存储服务。特别适用于物联网、大数据和互联网监控等拥有海量时序数据的场景。您可以根据实际业务需求快速创建CTSDB 实例,并随着业务变化实时线性扩展实例。CTSDB 为您提供高性能的数据读写服务,满足您业务快速发展的需求。
扫码关注云+社区
领取腾讯云代金券