elasticsearch(5) 请求体搜索
上一篇提到的轻量搜索非常简单便捷,但是通过请求体查询可以更充分的利用查询的强大功能。因为_search api中大部分参数是通过HTTP请求体而非查询字符串来传递的。
一 空查询
对于空查询来说,最简单的方式就是传入一个空的请求体,获取所有文档(默认返回前10个完整文档内容)
GET 127.0.0.1:/_search {}
你也可以使用from 和 size参数
GET 127.0.0.1:/_search
{
"from":,
"size":
}
这样的方式来查询第11条到15条的文档
- 大家可能会好奇,这明明是一个GET请求方式,为何可以有请求体。事实上这个RFC文档 RFC 7231— 一个专门负责处理 HTTP 语义和内容的文档 — 并没有规定一个带有请求体的
GET
请求应该如何处理。结果是,一些 HTTP 服务器允许这样子,而有一些 — 特别是一些用于缓存和代理的服务器则不允许。
为了避免这样的情况,ES也支持通过POST请求来进行查询
POST 127.0.0.1:/_search
{
"from":,
"size":
}
二 查询结构
查询表达式(Query DSL)是一种非常灵活又富有表现力的 查询语言。 Elasticsearch 使用它可以以简单的 JSON 接口来展现 Lucene 功能的绝大部分。在你的应用中,你应该用它来编写你的查询语句。它可以使你的查询语句更灵活、更精确、易读和易调试。
要使用查询表达式只需要将查询语句传递给query参数
- 典型的查询语句结构
{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
例如
{
"query": {
"match": {
"like": "sport"
}
}
}
查询like字段包含sport的文档
- 合并查询语句
查询语句就行一个组合块,这些组合块可以合并组成更加复杂的查询逻辑
合并查询语句里分为两种类型
1、叶子语句
即类似上述的match语句,可以被用来查询一个或多个字段的文档
2、复合语句
用于合并其他查询语句,可以通过一个bool语句组合其他语句,例如must匹配、must_not匹配,should匹配,或者filters过滤器
示例
{
"bool": {
"must": { "match": { "email": "business opportunity" }},
"should": [
{ "match": { "starred": true }},
{ "bool": {
"must": { "match": { "folder": "inbox" }},
"must_not": { "match": { "spam": true }}
}}
],
"minimum_should_match":
}
}
找出信件正文包含 business opportunity
的星标邮件,或者在收件箱正文包含business opportunity
的非垃圾邮件
三 查询与过滤
查询组件的使用可以分为两种情况,查询情况和过滤情况,这两种情况是有区别的
- 对于过滤情况来说,ES只是简单的过滤查询,对于文档是不会进行评分的,即文档要么匹配,要么就是不匹配,并没有介于其中的中间状态。
这种方式比较适用于确定的判断,例如created介于2017和2018之间,status等于有效等等
- 对于查询情况来说,查询就有了评分,不但需要判断文档是否匹配,还需要判断这个文档匹配的多好。
这种情况比较适用于全文搜索,因为全文搜索几乎没有完全正确的答案
一般情况下,由于查询情况需要评分,所以它的效率是没有过滤情况来的好的。通常使用 查询(query)语句来进行全文 搜索或者其它任何需要影响相关性得分的搜索。除此以外的情况都使用过滤(filters)。
- 实际上从ES2.0开始,过滤情况已经基本被排除了,因为查询拥有了不评分的能力。
四 查询方法
- match_all
match_all查询简单的匹配所有文档,在没有指定查询方式时,它是默认的查询,它经常与 filter 结合使用。由于所有文档被认为具有相同的相关性,所以文档的_score都为1
{
"query": {
"match_all": {}
}
}
- match
无论你在任何字段上进行的是全文搜索还是精确查询,match
查询是你可用的标准查询。如果是在全文字段上match,那么就会使用正确的分析器取分析查询字符串,如果是在精确值例如整型,时间等,那么就会精确匹配它。这部分内容会在后面的映射分析部分讲到。
{
"query": {
"match": {
"like": "sport"
}
}
}
- multi_match
multi_match查询可以在多个字段上执行相同的match, query属性里是查询的条件,fields属性对应的是多个字段。
{
"query": {
"multi_match": {
"query": "sport",
"fields":["like","career"]
}
}
}
- range查询
range查询可以找出落在指定区间内的数字或者时间,被允许的操作符有
gt:大于
gte:大于等于
lt:小于
lte:小于等于
{
"query": {
"range": {
"age": {
"gte": ,
"lt":
}
}
}
}
- term查询
term查询用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些未被分析的字符串
{ "term": { "age": }}
- terms查询
和term一样,但terms允许指定多值进行匹配,若包含任一值,文档则匹配。匹配的多值通过[ ] 来列出
{ "terms": { "tag": [ "search", "full_text", "nosql" ] }}
- exists查询
查询指定字段有值,NOT NULL。field:指定字段
{
"exists": {
"field": "title"
}
}
- missing查询
和exists相反,查询指定字段无值 NULL.
五 组合多查询
可以通过bool查询来合并组合多查询,bool查询接受一下参数
- must
文档必须匹配这些条件才能被包含
- must_not
文档必须不匹配这些条件才能被包含
- should
如果满足这些语句中的任意语句,将会增加_score,否则无任何影响,它主要用于修正每个文档的相关性得分
- filter
必须匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。所有查询包括bool查询本身都可以放置在filter语句中,使其本身不做评分。
- 如果没有must语句,那么至少需要能够匹配其中的一条
should
语句。但,如果存在至少一条must
语句,则对should
语句的匹配没有要求。
六 验证查询
可以使用_validate/query来验证查询是否合法
GET /test/test/_validate/query
{
"query": {
"like" : {
"match" : "sport"
}
}
}
响应
{
"valid" : false,
"_shards" : {
"total" : ,
"successful" : ,
"failed" :
}
}
这告诉我们这是非法的查询,这时我们可以使用explain来查询原因
GET /gb/tweet/_validate/query?explain
{
"query": {
"tweet" : {
"match" : "really powerful"
}
}
}
响应
{
"valid" : false,
"_shards" : { ... },
"explanations" : [ {
"index" : "gb",
"valid" : false,
"error" : "org.elasticsearch.index.query.QueryParsingException:
[gb] No query registered for [tweet]"
} ]
}
这告诉我们query中没有注册的tweet,应该把match和tweet调换位置
elasticsearch(5) 请求体搜索的更多相关文章
- 第2部分 Elasticsearch查询-请求体查询、排序
一.请求体查询 请求体 search API, 之所以称之为请求体查询(Full-Body Search),因为大部分参数是通过http请求体而非查询字符串来传递的. 请求体查询:不仅可以处理自身的查 ...
- elasticsearch 基础 —— 请求体查询
请求体查询 简易 查询 -query-string search- 对于用命令行进行即席查询(ad-hoc)是非常有用的. 然而,为了充分利用查询的强大功能,你应该使用 请求体 search API, ...
- Elasticsearch按请求体基本查询
1 分页: localhost:9200/get-together/_search {"query": {"match_all": {}},"from ...
- 〈三〉ElasticSearch的认识:搜索、过滤、排序
目录 上节回顾 本节前言 文档的搜索 URL参数条件搜索 请求体条件搜索 语法与示例: 补充: 小节总结: 文档的过滤filter 语法与举例: filter与bool constant_score ...
- elasticsearch(4) 轻量搜索
一 空搜索 搜索API的最基础的形式是没有指定任何查询的空搜索 ,它简单地返回集群中所有索引下的所有文档: 示例 GET 127.0.0.1:9200/_search 响应 { , "tim ...
- elasticsearch系列四:搜索详解(搜索API、Query DSL)
一.搜索API 1. 搜索API 端点地址 从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy 从索引tweet,user里 ...
- postman 安装,对elasticsearch进行请求
1 使用postman对elasticsearch进行测试 :下载插件: https://www.getpostman.com/apps ,下载时exe文件,双击自动安装,首次打开注册.下面就可以使 ...
- 转:在ElasticSearch之下(图解搜索的故事)
ElasticSearch 2 (9) - 在ElasticSearch之下(图解搜索的故事) 摘要 先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题: 为什么我 ...
- HTTP请求行、请求头、请求体详解
HTTP 请求头各参数具体含义 Header 解释 示例Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/htmlAccept-Charset 浏览器可以接 ...
随机推荐
- 查看linux是ubuntu还是centos
方式一: radhat或centos存在: /etc/redhat-release 这个文件[ 命令 cat /etc/redhat-release ] ubuntu存在 : /etc/lsb-rel ...
- win10无法搜索本地文件,修复方法?
win10无法搜索本地文件,实在太不方便了,网上查了一圈没几个方法有效的,筛选出来2个成功解决的问题,具体是哪个起到作用,不太清楚,都放上来,大家自行选择! 方法1:按“Windows+ X”后选择“ ...
- 实验性质的JIT compiler(Ruby2.6)
Ruby2.6的一个新的功能:Just in time complier 特点: 和传统的JIT编译器不一样之处:把代码写成C并存储在磁盘,并使用一个C编译器来生成native code.这样就节省了 ...
- 蓝鲸DevOps深度解析系列(2):蓝盾流水线初体验
关注嘉为科技,获取运维新知 前面一篇文章<蓝鲸DevOps深度解析系列(1):蓝盾平台总览>,我们总览了蓝鲸DevOps平台的背景.应用场景.特点和能力: 接下来我们继续解析蓝盾平台的 ...
- fail to resolve com.umeng.analytics:analytics:latest.integration
今天友盟接入的时候,他娘的居然提示我这个友盟jar包拉不下来 明明之前还好好的,而且别的什么东西都没问题,就这个有问题 原来使用的是 compile "com.umeng.analytics ...
- nmap工具简介
nmap参数介绍: -sL:简单列表扫描 -sn:扫描主机,但是不进行端口扫描 -sS:TCP SYN扫描[半开放扫描,扫描速度高且隐蔽性好] -p |-F:扫描端口列表与扫描次序,常用的扫描方式[- ...
- multi lstm attention 坑一个
multi lstm attention时序之间,inputs维度是1024,加上attention之后维度是2018,输出1024,时序之间下次再转成2048的inputs 但是如果使用multi ...
- 每日算法---Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- angular2学习笔记3
一.项目搭建 二.生成首页的4个tab页面 三.运行部署及配置
- IO多路复用版FTP
需求: 实现文件上传及下载功能 支持多连接并发传文件 使用select or selectors 流程图 import socket import pickle import sys import t ...