# ES详解 - 查询:DSL查询之全文搜索详解

DSL查询极为常用的是对文本进行搜索,我们叫全文搜索,本文主要对全文搜索进行详解。@pdai

# 写在前面:谈谈如何从官网学习

一些理解:

如下图,可以很方便的帮助你构筑这种体系

比如Full text Query中,我们只需要把如下的那么多点分为3大类,你的体系能力会大大提升

# Match类型

第一类:match 类型

# match 查询的步骤

在 前文中我们已经介绍了match查询。

这里我们准备一些数据,通过实例看match 查询的步骤

Elasticsearch 执行上面这个 match 查询的步骤是:

  1. 检查字段类型

标题 title 字段是一个 string 类型( analyzed )已分析的全文字段,这意味着查询字符串本身也应该被分析。

  1. 分析查询字符串

将查询的字符串 QUICK! 传入标准分析器中,输出的结果是单个项 quick 。因为只有一个单词项,所以 match 查询执行的是单个底层 term 查询。

  1. 查找匹配文档

用 term 查询在倒排索引中查找 quick 然后获取一组包含该项的文档,本例的结果是文档:1、2 和 3 。

  1. 为每个文档评分

用 term 查询计算每个文档相关度评分 _score ,这是种将词频(term frequency,即词 quick 在相关文档的 title 字段中出现的频率)和反向文档频率(inverse document frequency,即词 quick 在所有文档的 title 字段中出现的频率),以及字段的长度(即字段越短相关度越高)相结合的计算方式。

# match多个词深入

我们在上文中复合查询中已经使用了match多个词,比如“Quick pets”; 这里我们通过例子带你更深入理解match多个词

查询多个词"BROWN DOG!"

因为 match 查询必须查找两个词( ["brown","dog"] ),它在内部实际上先执行两次 term 查询,然后将两次查询的结果合并作为最终结果输出。为了做到这点,它将两个 term 查询包入一个 bool 查询中,

所以上述查询的结果,和如下语句查询结果是等同的

上面等同于should(任意一个满足),是因为 match还有一个operator参数,默认是or, 所以对应的是should。

所以上述查询也等同于

那么我们如果是需要and操作呢,即同时满足呢?

等同于

# 控制match的匹配精度

如果用户给定 3 个查询词,想查找至少包含其中 2 个的文档,该如何处理?将 operator 操作符参数设置成 and 或者 or 都是不合适的。

match 查询支持 minimum_should_match 最小匹配参数,这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量:

当给定百分比的时候, minimum_should_match 会做合适的事情:在之前三词项的示例中, 75% 会自动被截断成 66.6% ,即三个里面两个词。无论这个值设置成什么,至少包含一个词项的文档才会被认为是匹配的。

当然也等同于

# 其它match类型

match_phrase在前文中我们已经有了解,我们再看下另外一个例子。

很多人对它仍然有误解的,比如如下例子:

这样的查询是查不出任何数据的,因为前文中我们知道了match本质上是对term组合,match_phrase本质是连续的term的查询,所以f并不是一个分词,不满足term查询,所以最终查不出任何内容了。

那有没有可以查询出quick brown f的方式呢?ELasticSearch在match_phrase基础上提供了一种可以查最后一个词项是前缀的方法,这样就可以查询quick brown f

(ps: prefix的意思不是整个text的开始匹配,而是最后一个词项满足term的prefix查询而已)

除了match_phrase_prefix,ElasticSearch还提供了match_bool_prefix查询

它们两种方式有啥区别呢?match_bool_prefix本质上可以转换为:

所以这样你就能理解,match_bool_prefix查询中的quick,brown,f是无序的。

如果我们期望一次对多个字段查询,怎么办呢?ElasticSearch提供了multi_match查询的方式

*表示前缀匹配字段。

# query string类型

第二类:query string 类型

# query_string

此查询使用语法根据运算符(例如AND或)来解析和拆分提供的查询字符串NOT。然后查询在返回匹配的文档之前独立分析每个拆分的文本。

可以使用该query_string查询创建一个复杂的搜索,其中包括通配符,跨多个字段的搜索等等。尽管用途广泛,但查询是严格的,如果查询字符串包含任何无效语法,则返回错误。

例如:

这里查询结果,你需要理解本质上查询这四个分词(term)or的结果而已,所以doc 3和4也在其中

对构筑知识体系已经够了,但是它其实还有很多参数和用法,更多请参考 官网在新窗口打开

# query_string_simple

该查询使用一种简单的语法来解析提供的查询字符串并将其拆分为基于特殊运算符的术语。然后查询在返回匹配的文档之前独立分析每个术语。

尽管其语法比query_string查询更受限制 ,但simple_query_string 查询不会针对无效语法返回错误。而是,它将忽略查询字符串的任何无效部分

举例:

更多请参考 官网在新窗口打开

# Interval类型

第三类:interval类型

Intervals是时间间隔的意思,本质上将多个规则按照顺序匹配。

比如:

因为interval之间是可以组合的,所以它可以表现的很复杂。更多请参考 官网在新窗口打开

# 参考文章

https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html#full-text-queries

https://www.elastic.co/guide/cn/elasticsearch/guide/current/match-multi-word.html

深圳SEO优化公司百色建站推荐鹤岗企业网站建设推荐梅州企业网站建设多少钱泰州品牌网站设计哪家好郴州网络推广推荐泰安网站优化按天收费报价沈阳网站优化按天计费公司德宏建站价格萍乡网站定制价格湘西品牌网站设计报价平湖网站推广多少钱抚州模板推广价格大浪网站推广系统公司百色网站制作多少钱海口网站制作呼和浩特seo网站优化报价贺州网站优化按天计费哈密至尊标王报价泸州网页制作报价青岛企业网站改版哪家好平凉营销型网站建设大鹏网站改版推荐本溪网站设计湘西网站排名优化哪家好湘潭网站推广工具报价桐城设计公司网站价格西安企业网站制作盐城SEO按天收费多少钱绍兴网站定制公司河源模板推广推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化