一、 Search API

eg: GET /mall/product/_search?q=name:productName&sort=price desc

特点:search的请求参数都是以HTTP请求的的query stirng 附带的

适用范围:适用于临时的在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息;

适用于简单的查询条件

二、Query DSL

将Query DSL视为ASL查询则有两种类型的查询语句:

叶子查询语句(Leaf Query clause) :

叶子查询语句根据指定的字段查询指定的值,比如match,term,rang查询(他们也可以自己嵌套自己查询)

复合查询语句(compound query clause):

复合查询语句包装了其他叶子查询语句或者复合查询语句,并被用于以逻辑方式组合多个查询(比如:bool和dis_max查询)或者改变他们的行为(比如constant_score查询)

查询语句的不同行为取决于查询语句是在query上下文还是在filter上下文内。

1、Query and filter Context

(1)Query Context

在Query Context中,一个查询语句用以回答“document与 查询语句 是有多么匹配”,除了决定document是否匹配,查询语句还计算一个表示document 匹配度的分值_score,相对于其他document。

无论何时一个查询语句被传递给query参数 query context都生效,就像search api里面的query参数

注意:query参数是指  json body里面 query:{这里面的请求参数}

(2)Filter Context

在Filter Context中,一个查询语句用以回答“这个document是否匹配于查询语句”并不进行分值的计算。Filter Context通常被用于过滤结构化数据。

经常被使用的Filter,Elasticsearch将自动进行缓存,以提升性能。

无论何时一个查询语句传递给filter 参数,Filter Context都将生效,就像bool查询中的must_not参数和filter参数。而filter参数在constant_score查询或者filter聚合中。

2、Match All Query

//匹配所有document,默认_score分值为1

GET /_search

{

"query":{

"match_all":{}

}

}

可以通过boost修改分值

GET /_search

{

"query": {

"match_all": { "boost" : 1.2 }

}

}

match_none 与match_all相反,没有document与之匹配

GET /_search

{

"query":{

"match_none":{}

}

}

3、Full text querise

高水平的全文查询 通常用于在全文字段上进行全文查询,像在body和email上。他们清楚字段是如何被查询的并且在执行之前将每个字段的analyzer(或者analyzer_search)应用在字符串查询中。

(1) Match query

标准的全文查询,包括模糊匹配,短语和近义词查询

match查询接受text 文本,数字numeric,日期dates进行查询

GET /_search

{

"query":{

"match":{

"message":"query text"        

}

}

}

其中,message字段会先被拆解,建立倒排索引

1)match

match查询是一个boolean类型。它意味着他不仅将分析所提供的文本而且在分析处理过程中还从提供的文本中钩子一个boolean类型的查询。 operate标记可以设置成or或者and 以控制boolean语句(默认为or),可以使用minimum_should_match参数设置匹配的最小数的可选的should语句

analyzer可以用于控制哪个分析器analyzer将执行文本的分析处理过程,字段默认精确匹配于定义信息或者默认搜索分析器。

lenient参数设置为true时将忽视由数据类型不匹配导致的异常信息,就像尝试用一个文本text查询字符串的方式查询一个数字字段。lenient参数默认情况下为false

2)Fuzziness 模糊匹配

fuzziness允许基于查询的字段类型进行模糊匹配。

prefix_length和max_expansions可以用于控制模糊处理过程,在这种情况下。如果模糊选项设置成这样的查询将使用top_terms_blended_freqs_${max_expansions}作为他的重写方法,fuzzy_rewrite参数允许控制查询如何进行重写。

fuzzy transpostions 模糊移项(ab->ba)默认情况下是允许的,但是也可以通过设置fuzzy_transpositions设置成false来禁用掉。

GET /_search

{

"query":{

"match":{

"message":{

"query":"this is a test",

"operator":"and"

}

}

}

}

3)Zero terms query(zero_terms_query)

如果分析器移除查询里面的所有token就像stop过滤器所做的那样,那么默认的行为是将不匹配任何document。为了改变这些,可以使用zero_terms_query 选项,它接收默认值none和与match_all查询一致的all值

GET /_search

{

"query":{

"match":{

"message":{

"query":"to be or not to be",

"operator":"and",

"zero_terms_query":"all"

}

}

}

}

4)Cutoff frequency(cutoff_frequency )

match查询支持cutoff_frequency,即允许指定一个绝对的或者相对的文档频率。高频率的词组被移动至一个任意的子查询内。如果子查询存在一个低频词组 在or操作的情况下 和所有的低频词组 都在and操作匹配的情况下这些仅仅被存储起来。

这些查询允许运行时动态处理stopwords的动作是领域独立的并且不需要一个分词stopwords文件。它阻止得分/迭代高频词组 并且只有更加有意义的或者低频的词组匹配一个文档时才考虑这些词组。但是,如果所有的查询词组

都在所给定的cutoff_frequency值之上,则将自动被传递给一个纯粹的连接词(and)查询以保证快速执行。

cutoff_frequency要么与文档的总数相关如果在0到1范围内,要么绝对大于或者等于1.0

以下这个例子展示了由专门分词组成的一个查询:

GET /_search

{

"query":{

"match":{

"message":{

"query":" to be or not to be",

"cutoff_frequency":0.001

}

}

}

}

(2)Match Phrase Query(match_phrase)

像match查询,但是被用于精确匹配短语或者近义词匹配

match_phrase查询分析指定的文本并从该分析文本中创建一个短语查询,如下:

GET /_search

{

"query":{

"match_phrase":{

"message":"this is test"    

}

}

}

在任何顺序中,短语查询匹配于一个可配置的slop(默认值为0)。转置的项有一个值为2的slop

analyzer可以用于控制分析器将要执行的文本的分析过程。它默认为字段显示映射于定义或者默认的搜索分析器

GET /_search

{

"query":{

"match_phrase":{

"message":{

"query":"this is a text",

"analyzer":"my_analyzer"

}

}

}

}

(3)Match Phrase Prefix Query(match_phrase_prefix)

官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html

Elasticsearch学习笔记(二)Search API 与 Query DSL的更多相关文章

  1. ZooKeeper学习笔记二:API基本使用

    Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...

  2. 2018/2/11 ELK技术栈之ElasticSearch学习笔记二

    终于有时间记录一下最近学习的知识了,其实除了写下的这些还有很多很多,但懒得一一写下了: ElasticSearch添加修改删除原理:ElasticSearch的倒排索引和文档一旦生成就不允许修改(其实 ...

  3. Elasticsearch学习笔记二

    PS:上一篇已经介绍了ES的一些基础概念以及单机版ES的安装,配置,本文主要介绍ES的集群管理,CRUD以及简单聚合查询. 集群管理 ES的集群部署起来也很方便,将单机版SCP复制几分,修改elast ...

  4. ElasticSearch学习笔记(超详细)

    文章目录 初识ElasticSearch 什么是ElasticSearch ElasticSearch特点 ElasticSearch用途 ElasticSearch底层实现 ElasticSearc ...

  5. Elasticsearch学习笔记一

    Elasticsearch Elasticsearch(以下简称ES)是一款Java语言开发的基于Lucene的高效全文搜索引擎.它提供了一个分布式多用户能力的基于RESTful web接口的全文搜索 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  8. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  9. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

随机推荐

  1. Mac NVM 配置

    1.NVM 简介 NVM(node version manager)是一个可以让你在同一台机器上安装和切换不同版本 node 的工具. GitHub 地址 2.NVM 环境配置 2.1 安装 NVM ...

  2. 2017年PHP程序员未来路在何方

    PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js . GO . Python 不断地在挑战 PHP 的地位.这些技术的推 ...

  3. MySQL利用mysqldump在线修复或新增从库

    如果数据库的数据量不是很大,可以利用mysqldump导出备份修复从库故障或新增从库实例 主库IP:192.168.1.1从库IP:192.168.1.2 1.主库服务器导出备份:db_name=`m ...

  4. FFmpeg中的时间基(time_base), AV_TIME_BASE

    AV_TIME_BASE 经常在FFmpeg的代码中看到一个奇怪的单位 AV_TIME_BASE ,比如 AVFormatContext 结构体中就有这样一个字段: duration ,它在FFmpe ...

  5. 开源Web自动化测试工具Selenium IDE

    Selenium IDE(也有简写SIDE的)是一款开源的Web自动化测试工具,它实现了测试用例的录制与回放. Selenium IDE目前版本为 3.6 系列,支持跨浏览器运行,所以IDE的UI从原 ...

  6. RSA加密算法详解(二)

    研究RSA 不知为何,这几天突然有些心烦.望苍茫大地,凭添几分忧伤,可能是下雨的缘故.本篇主要想详细介绍RSA加密算法的原理,经常听别人说,这里是自己想搞清楚,弄明白.首先介绍了基本的数学原理,然后给 ...

  7. hdoj:2050

    #include <iostream> using namespace std; int main() { int T; while (cin >> T) { ; i < ...

  8. C# SMTP 邮件发送之QQ邮箱篇

    邮件发送大家都已经非常熟悉了,微软自带的System.Net.Mail也很好用,那为什么还要说呢? QQ邮箱的SMTP以前是非SSL,用未加密的25端口,后来发送都改成SSL了,端口为465或587( ...

  9. GPRS模块在Linux平台上ppp拨号上网总结与心得

    linux平台的ppp拨号上网,(注明:这里只谈命令行拨号,用linux就要习惯和熟练使用命令行) 在网上常见的有三种方式:1.使用智能的ppp拨号软件wvdial:参考案例:本博客的<使用wv ...

  10. vue filter方法-时间格式化

    plugins/filter.js import Vue from 'vue' // 时间格式化 // 用法:<div>{{data | dataFormat('yyyy-MM-dd hh ...