• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
孙龙 程序员
少时总觉为人易,华年方知立业难
博客园    首页    新随笔    联系   管理    订阅  订阅
Elasticsearch 篇之Search API 介绍 二QueryDSL
Elasticsearch 篇之Search API 介绍

Query DSL

这是一个基于 JSON 定义的查询语言,主要包含两种类型:

字段查询:如 term、match、range等,只针对某一字段进行查询

复合查询:如bool查询等,包含一个或多个字段类查询或复合查询语句

Query DSL- 字段类查询

字段类查询主要包含下面的两类:

 

 

match query

。这个语句就表示返回包含alfred或way的文档。

 

match query的流程

 

 

match query参数

在前面的查询中待查询语句满足其中的一个即可,es提供了一个参数用来表示查询语句匹配关系:

---这个例子中就表示必须同时包含alfred和way

 

 

 

相关性算分
在match query流程中,汇总的分的过程是es根据内部的相关性算分算法(TF/IDF、BM25等)进行计算的。在es5.x版本后默认使用BM25算法进行相关性算分。

相关性算分是指文档与查询语句之间的相关度(relevance)。其本质是一个排序问题,就是当通过倒排索引获取到匹配的文档列表后,如何将最符合用户需求的文档排在前列。

相关性算分具有如下的重要概念:

 

 

 

 

 

 BM25算法中BM指的是BEST MATCH,25指的是迭代了25次才计算方法,是针对TF/IDF的一种优化,计算公式如下:

 

 

 

 

match phrase query

对字段有检索,有顺序要求,API如下:

----这个例子是:匹配java和engineer关键字的文档,且java要在engineer前面。

 

 

 

match phrase query参数

通过slop参数控制单词间的间隔:

这样额话,就表示允许匹配的文档可以与 java engineer有一个距离的差异。这样,java senior engineer这样的字段就可以返回了。

 

 

query string query

类似于 URI search中的q参数查询:

这个例子就表示返回返回username字段中包含alfred和way的文档

 

 这个表示查询username 和 job字段,条件是包含alfred或同时包含java和ruby

 

 

 

 

simple query string query

类似于query string,但是会忽略掉错误的查询语法,并且仅支持部分的查询语法。不能使用 AND,OR,NOT等关键词,使用 +代替AND, | 代替OR,- 代替 NOT。

 

 

Term query

将查询语句作为一个整体进行查询,不进行分词:

 

 

Terms query

一次传入多个单词进行查询:

 

 

range query

范围查询主要针对日期和数值类型:

 

 

 

 Date Math是针对日期的一种更友好的计算格式:

 

 主要的时间单位有:y(year)、M(months)、w(week)、d(days)、h(hours)、m(minutes)、s(seconds)

 

 

复合查询

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

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

 

constant_score query将其内部的查询结果文档得分都设定为1或者boost的值,多用于结合bool查询实现自定义得分

:

 

 在返回的结果中,_score的值全部为1

 

bool query由一个或多个bool子句组成,主要包含以下4个:

 

 

 

 filter查询只返回符合条件的文档而不关心相关性,不进行相关性算分。es对filter有智能缓存,所以其执行效率很高。所以在执行简单查询而不考虑相关性的时候推荐使用filter代替query等。

 

 执行结果中的_score的值为0,表示没有进行相关性算分

 

must指定了必须符合的条件:

 

 must_not是指排除must_not中符合条件的文档:

 

 

should的使用有两种情况:

  • bool查询中只包含should,不包含must查询
  • bool查询中同时包含should和must查询

 

 

query context 和filter context的区别

 

 

 

 

count api

这个api是用于返回符合条件的文档数,endpoint为_count

 

 

source filtering

过滤返回结果中_source的字段,节省网络开销:

 

本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/12833275.html

posted on 2020-05-05 22:17  孙龙-程序员  阅读(548)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3