4 Elasticsearch 篇之Search API 介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingdianone/article/details/86530895

SearchAPI概览

实现对es中存储的数据进行查询分析, endpoint为_search ,如下所示:
在这里插入图片描述

  • 查询主要有两种形式
    • URI Search,操作简便,方便通过命令行测试
    • 仅包含部分查询语法
  • Request Body Search
    • es提供的完备查询语法Query DSL(Domain Specific Language)
      在这里插入图片描述

URISearch详解与演示

  • 通过url query参数来实现搜索,常用参数如下:
    • q指定查询的语句,语法为Query String Syntax
    • df q中不指定字段时默认查询的字段,如果不指定, es会查询所有字段
    • sort排序
    • timeout指定超时时间,默认不超时
    • from,size用于分页
      在这里插入图片描述

Query String Syntax

  • term与phrase
    • alfred way等效于alfred OR way
    • "alfred way"词语查询,要求先后顺序
  • 泛查询
    • alfred等效于在所有字段去匹配该term
  • 指定字段
    • name:alfred
  • Group分组设定,使用括号指定匹配的规则
    • (quick OR brown) AND fox
    • status:(active OR pending) title:(full text search)

测试:
在这里插入图片描述
在这里插入图片描述
查询所有字段里有alfred的
在这里插入图片描述
“progile”:true会显示详细查询语句
在这里插入图片描述
只针对username查询
在这里插入图片描述
username:alfred和way是or的关系所以会返回三条
在这里插入图片描述
只返回一条,词语查询
在这里插入图片描述
username是alfred或则way的,将词语和列表组合在一起使用。
在这里插入图片描述

布尔操作符

  • AND(&&), OR(||), NOT(!)
    • name:(tom NOT lee)
    • 注意大写,不能小写
  • ±分别对应must和must_not
    • name:(tom +lee -alfred)
    • name:((lee && !alfred) Il (tom && lee && !alfred))
    • +在url中会被解析为空格,要使用encode后的结果才可以,为%2B

以上中tom +lee -alfred一定包含lee一定不包含alfred 可以包含tom
username:alfred查询和way的范查询

username:alfred查询和way的范查询

+要换成%2B
在这里插入图片描述

  • 范围查询,支持数值和日期
    • 区间写法,闭区间用[],开区间用{},
    • age:[1 TO 10]意为1<=age<=10 ,
    • age:[1 TO 10}意为1<=age<10 ,
    • age:[1 TO ]意为age>=1 ,
    • age:[* TO 10]意为age<=10
  • 算数符号写法
    • age:>=1,
    • age:(>=1 && <=10)或者age(+>=1 +<=10)

正则和通配符都是吃内存的;不建议使用,特别是文档很大的时候

通配符查询

  • ?代表1个字符,*代表0或多个字符
    • name:t?m
    • name:tom*
    • name:t*m
    • 通配符匹配执行效率低,且占用较多内存,不建议使用
    • 如无特殊需求,不要将?/*放在最前面
  • 正则表达式匹配
    • name:/[mb]bat/
      在这里插入图片描述
  • 模糊匹配fuzzy query
    • name:roam~1
    • 匹配与roam差1个character的词,比如foam roams等
  • 近似度查询proximity search
    • “fox quick”~5
    • 以term为单位进行差异比较,比如"quick fox" "quick brown fox"都会被匹配

允许有一个字母的误差:
在这里插入图片描述
在这里插入图片描述
允许词中插入一个词:
在这里插入图片描述
在这里插入图片描述

QueryDSL简介

Request Body Search

  • 将查询语句通过http request body发送到es ,主要包含如下参数 -query符合Query DSL语法的查询语句
    • from,size
    • timeout
    • sort

    • 在这里插入图片描述
      QueryDSL
  • 基于JSON定义的查询语言,主要包含如下两种类型:
    • 字段类查询
      • 如term, match, range等,只针对某一个字段进行查询
    • 复合查询
      • 如bool查询等,包含一个或多个字段类查询或者复合查询语句

字段类查询简介及match-query

  • 字段类查询主要包括以下两类:
    • 全文匹配
      • 针对text类型的字段进行全文检索,会对查询语句先进行分词处理,如match,match phrase等query类型
    • 单词匹配
      • 不会对查询语句做分词处理,直接去匹配字段的倒排索引,如term, terms,range等query类型
  • 对字段作全文检索,最基本和常用的查询类型, API示例如下:
    在这里插入图片描述
    在这里插入图片描述

Match Query – 流程

在这里插入图片描述
通过operator参数可以控制单词间的匹配关系,可选项为or和and

在这里插入图片描述
通过minimum_should_match参数可以控制需要匹配的单词数
在这里插入图片描述

相关性算分

  • 相关性算分是指文档与查询语句间的相关度,英文为relevance
    • 通过倒排索引可以获取与查询语句相匹配的文档列表,那么如何将最符合用户查询需求的文档放到前列呢?
    • 本质是一个排序问题,排序的依据是相关性算分
      在这里插入图片描述
  • 相关性算分的几个重要概念如下:
    • Term Frequency(TF)词频,即单词在该文档中出现的次数。词频越高,相关度越
    • Document Frequency(DF)文档频率,即单词出现的文档数
    • Inverse Document Frequency(IDF)逆向文档频率,与文档频率相反,简单理解为1/DF,即单词出现的文档数越少,相关度越高
    • Field-length Norm文档越短,相关性越高

TF/IDF模型

TF/IDF模型是Lucene的经典模型,其计算公式如下:

在这里插入图片描述

  • 可以通过explain参数来查看具体的计算方法,但要注意:
    • es的算分是按照shard进行的,即shard的分数计算是相互独立的,所以在使用explain的时候注意分片数
    • 可以通过设置索引的分片数为1来避免这个问题
      在这里插入图片描述
      通过explain可以看出详细的计算方式 :
      在这里插入图片描述

BM25模型

.BM25模型中BM指Best Match , 25指迭代了25次才计算方法,是针对TF/IDF的一 .个优化,其计算公式如下:
在这里插入图片描述
BM25相比TF/DF的一大优化是降低了tf在过大时的权重:
在这里插入图片描述

match-phrase-query

对字段作检索,有顺序要求, API示例如下:
在这里插入图片描述
在这里插入图片描述
通过slop参数可以控制单词间的间隔
在这里插入图片描述

query-string-query

类似于URI Search中的q参数查询
在这里插入图片描述
·类似Query String ,但是会忽略错误的查询语法,并且仅支持部分查询语法
·其常用的逻辑符号如下,不能使用AND, OR, NOT等关键词

  • +代指AND
  • |代指OR
  • -代指NOT请求
    在这里插入图片描述
    只包含way可以不包含alfred
    在这里插入图片描述
    用and就会被识别为字符串:
    在这里插入图片描述

term-terms-query

·将查询语句作为整个单词进行查询,即不对查询语句做分词处理,如下所示:
在这里插入图片描述
一次传入多个单词进行查询,如下所示:
在这里插入图片描述
在这里插入图片描述

range-query

·范围查询主要针对数值和日期类型,如下所示:
在这里插入图片描述
针对日期做查如所:
在这里插入图片描述
针对日期提供的一种更友好地计算方式,格式如下:
在这里插入图片描述
·单位主要有如下几种:
-y - years
-M -months
-w -weeks
-d -days
-h -hours
-m - minutes
-S -seconds
·假设now为2018-01-02 12:00:00 ,那么如下的计算结果实际为:
在这里插入图片描述

复合查询介绍及ConstantScore

QueryDSL-复合查询

·复合查询是指包含字段类查询或复合查询的类型,主要包括以下几类:

  • constant_score query
  • bool query
  • dis_max query
  • function_score query
  • boosting query

Constant Score Query

·该查询将其内部的查询结果文档得分都设定为1或者boost的值

  • 多用于结合bool查询实现自定义得分

在这里插入图片描述

bool-query

·.布尔查询由一个或多个布尔子句组成,主要包含如下4个:

在这里插入图片描述
在这里插入图片描述
Filter

Filter查询只过滤符合条件的文档,不会进行相关性算分

  • es针对filter会有智能缓存,因此其执行效率很高
  • 做简单匹配查询且不考虑算分时,推荐使用filter替代query等
    在这里插入图片描述

must

在这里插入图片描述
must_not
在这里插入图片描述
Should

  • Should使用分两种情况:
    • bool查询中只包含should ,不包含must查询
    • bool查询中同时包含should和must查询
  • 只包含should时,文档必须满足至少一个条件
    • minimum_should_match可以控制满足条件的个数或者百分比

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
·同时包含should和must时,文档不必满足should中的条件,但是如果满足条件,会增加相关性得分
在这里插入图片描述
Query Context VS Filter Context

当一个查询语句位于Query或者Filter上下文时, es执行的结果会不同,对比如下:
在这里插入图片描述
在这里插入图片描述

count-and-source-filtering

count

获取符合条件的文档数, endpoint为_count
在这里插入图片描述
source filtering

过滤返回结果中source中的字段,主要有如下几种方式:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/bingdianone/article/details/86530895