全文检索 ElasticSearch

it2024-09-27  54

入门 cat

put: 一定要带id,不然会报错。 post:不一定要带id,不带id的话es 会自动创建一个数据。

A,B 同时发送请求去修改同一条数据,当B 先将数据修改成功后,_seq_no 就是+1,而此时A 就可以检测一下,_seq_no 还是否是一开始看到的0,如果不是,则停止A 对数据的修改。 所以此时A 还想继续修改数据,那么就要查询出最新的信息,然后根据最新信息再来进行修改。

在更新操作中,如果上一次更新和这一次更新的数据都是一样的,result:“noop” -> no operation(没有操作) post 带_update,修改的参数前就会先对比元数据。规格:修改参数就要属于一个参数:doc

post,put 不带update ,修改参数时不对比元数据,version和seq_no 都会改变

post(带_update):先检查元数据是否有age 属性,有则判断age 属性值是否相同,不相同则修改。没有age 属性则添加age 属性。 put 和post 不带_update 也可以增添属性,并且不对比元数据。

在ES 中没有提供直接删除类型(表)的操作,但可以通过1:删除索引(index) 来间接删除类型(type)。2. 清空类型(表)下的所有索引

Tips: 批量操作在PostMan 中是无法进行的(会报错),所以还是要用Kibana

在bank 索引下的,account类型中,执行index(保存)操作。

source: 该记录保存的数据。id:在类型中的唯一标识。

虽然有1000 条数据,但是ES 依然会帮我们对数据进行分页。所以第一次返回的是第一页数据,共10 条。 检索语法一: asc : 升序排序

检索语法二:常用 query:查询条件。 sort:排序条件 分页查询:

查询所有字段:

查询所有字段,并按照balance 属性进行降序排列 简写版本: 分页查询: from: 从0 开始。 size: 每页5 条数据

指定返回数据,只要数据的哪个字段。 比如:只要source 中的balance 返回值:

当需要数据中的多个值。比如source 的多个字段,需要用[] 进行括住

因为查询了是一个非字符串数据,所以score = 1.0 == max_score

因为匹配的是字符串数据,所以可能是模糊查询,所以score 是不等于 1 的。

score 最接近 max_score 排在最上面,并且默认排序就是score 从高到低进行排序。 全文检索按照评分进行排序(就是所谓的倒排索引),会对检索条件进行分词匹配

不会把mill road 拆分成两个单词:mill,road 进行查询,而是当成一个单词:mill road进行查询。查询到的结果可以包含mill road。 字段.keyword 和match_phrase 的效果是一样的,都是将值看成一个整体单词进行搜索。如果用这个方法匹配的是文本字段(字符串),是要进行精确匹配的,即匹配到的文本字段不能多,也不能少。

查询address 和city 字段中包含"mill" 或者 “movico” 单词的索引。

must:必须。 匹配到的gender 必须包含“M”,address 必须包含“mill” 在必须满足gender包含"M",address包含"mill"。也得满足必须不包含age=38。(数值在kibana 中可以有字符串,也可以没有)

should:应该满足,即不满足也没关系。must 是必须满足。如果should 也匹配上,score (相关性得分(relevance score))就能更接近max_score。

范围查询:必须满足 0 <= age <= 20

利用filter 也能查询出上图的结果。区别就是filter 查询出的结果没有相关性得分,must 得出的结果有相关性得分。

filter 和must 也能连用:

term 和match 一样也是用来查东西的。但是全文检索的文本字段(非数值)不要用term,用match。

查询非文本字段(数值),用term 进行查询。是文本字段(字符串),就用match 进行查询。

例:搜索address 中包含 mill 的所有人的年龄分布以及平均年龄,但是显示这些人的信息。 terms: 看age 的分布,ageAggs 的size是:如果age 有100 种可能,只显示前10 种。 avg:计算age 的平均值。 size: 0。不要hits 中的数据,只要aggregations 的数据

一个聚合中嵌套一个子聚合,子聚合能使用父聚合的数据。

因为算出年龄段分布的总体平均薪资和算出年龄段分布中M和F 的平均薪资都需要用到年龄段的分布,所以他们是属于年龄段分布的子聚合,并且是兄弟关系。

ES 7中去除了type 概念

创建映射(mapping): 能进行映射的数据类型有: keyword 也是一种类型,它的类型就是keyword。 创建一个索引,指定其中属性的类型映射。只要以下的索引执行,那么后面添加的类型映射不能直接往里面写了,会报错。因为这个my_index 索引已经存在了,所以再执行一次就会发生报错。 新增映射: 往my_index 中添加新映射字段:put /my_index/_mapping 如果新添加的映射中设置: index = false。那就是添加的这个映射字段就不会被my_index 索引到,那么这就是一个冗余字段。默认添加的映射字段都是:index = true。

无法修改原来的映射数据,所以只能再创建一个新的映射索引,再把旧的数据迁移到新的映射索引中。

在ES 7 以前的版本中是有type 的,7 之后可会删除这一概念,7 中还能使用。所以在这里数据迁移时,des 中不需要指定type。 迁移数据用: POST _reinindex

分词功能是ES 中做全文检索的核心。 ES 中分词器是针对英文的,对于中文的分词,需要额外安装中文的分词器。

最新回复(0)