暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ES查询篇

李宇涛L 2022-02-14
1369

    ES的查询是非常好玩的,接下来介绍介绍ES的各种查询。ES字段的数据类型有text、keyword、long、date、integer、double、boolean等类型。比如对 "我的宝马有多少马力"进行查询,分词后为 "宝马" "多少" "马力"。


    1. match:所有包含这三个词中的一个或多个文档就会被搜索出来,同样 "我的保时捷马力不错" 也会被搜索出来;


    2. match_pharse:精确匹配,如果想同时匹配包含"宝马" "多少" "马力"就可以用match_pharse,对于这种比较严格的匹配,可以外加调节因子,少一个也可以匹配成功,增加参数slop:1


    3. multi_match:如果相对多个字段进行匹配,其中一个字段有这个文档就满足的话,就是用这个查询。multi_match会涉及到匹配评分的问题,如果希望完全匹配的文档的评分较高,需要使用best_fields,增加参数 "type":best_fields"tie_breaker:0.3,并且如果只匹配单词的文档评分乘以0.3;如果希望多字段匹配的文档评分越高,使用 type:most_fields;如果希望这个词条的分词词汇分配到不同字段,使用 type:cross_fields;


    4. term:不进行分词处理,文档中必须包含整个搜索词汇,比如 搜索"汽车保养",那么文档中 也必须包含 "汽车保养" 这一复合词,一般在创建索引时会指定 type 为 keywords,这样子整个就可以在倒排索引中了;


    5. wildcard:通配符查询,和linux支持通配符是一样的,但是ES的API明确指出,不建议使用通配符匹配,数据量很大的情况下,可能会导致查询很慢;


    6. fuzzy:模糊查询,涉及到编辑距离一个概念,编辑距离可以理解为一个词转换为另一个词所需要的步骤,可以替换、插入或删除一个字符,根据手动指定的编辑距离查询符合要求的全部文档,参数设置:"fuzziness":1; 


    7. bool联合查询:must、should、must_not 可以理解为 且、或、非。


    查询的原理是倒排索引,倒排索引中存储的词取决于创建索引时字段各自的数据结构,ES默认分词器对英文句子是以空格进行分词的,对中文来说是对单字进行分词的(一个句子分成一个一个的单字)。如果需要中文分词,需要第三方的分词插件,一般是IK Analysis插件,可选的有 ik_max_word 细粒度分词和 ik_smart 粗粒度分词,还有停止词等扩展功能,很强大,ES索引索引在创建时指定分词方式就可以。


文章转载自李宇涛L,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论