说在前面: 本文的所有演示, 都是基于Elasticsearch 6.6.0进行的, 不同的版本可能存在API发生修改、不支持的情况, 还请注意.

1 Search API的基本用法

1.1 查询所有数据

GET _search

1.2 响应信息说明

{
"took" : 346, // 整个检索消耗的时间, 单位是毫秒. 包括线程池中的等待时间、集群中分布式搜索+收集结果的时间
"timed_out" : false, // 默认不启用超时机制, 若启用, 需要设置具体的时间值
"_shards" : { // 搜索用到的shard数, 以及成功/失败的shard数
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0 // 一个Shard的Primary和Replicas都挂掉, 它才被认为失败
},
"hits" : {
"total" : 10, // 本次搜索命中(搜索到)的结果总数
"max_score" : 1.0, // 本次搜索的所有结果中, 最大的相关度分数
"hits" : [ // 默认显示查询结果中的前10条记录, 根据_score降序排序
{
"_index" : "book_shop",
"_type" : "books",
"_id" : "2",
"_score" : 1.0, // 相关度得分, 越相关, 分值越大, 排位越靠前
"_source" : {
"name" : "Java编程思想",
"category" : "编程语言",
"author" : "Bruce Eckel",
"price" : 105.0,
"publisher" : "机械工业出版社",
"date" : "2016-01-01"
}
}
]
}
}

1.3 timeout超时机制

指定每个Shard必须在规定的时间 (也就是指定的timeout时间) 内, 将搜索到的数据 (可能只搜索到了部分数据, 也可能搜索到了全部数据) 立即返回给客户端, 而不是等待查询操作完全完成后再返回.

—— 确保在指定时间内返回数据, 无论查询是否完成.

ES的搜索默认不开启timeout, 查询持续的时间 (latency) 将根据查询的完整性 (completeness) 自动延迟, 可以手动指定timeout, 使用示例:

GET _search?timeout=10ms
# 可用的单位: timeout=10ms | timeout=1s | timeout=1m

举例说明: ES能在1分钟内查询到符合条件的全部数据有2000条, 在指定timeout=10之后, 就会在10ms时返回查询到的部分结果, 此时可能只查询到了其中的100条数据.

1.4 查询多索引和多类型中的数据

(1) 一次性搜索多个索引(multi-index) 中的数据:

# 搜索指定一个index下的所有数据
GET index1/_search # 同时搜索两个index下的数据
GET index1,index2/_search # 按照通配符匹配搜索多个index下的数据
GET *1,*2/_search

(2) 和多个类型(multi-type)在的数据:

注意: Elasticsearch 6.x之前的版本中, 支持一个index下有多个type, 在6.x之后的版本就只能定义一个type.

# 搜索一个index下指定的type的数据
GET index1/type1/_search # 搜索一个index下多个type的数据
GET index1/type1,type2/_search # 搜索多个index下的多个type的数据
GET index1,index2/type1,type2/_search # _all, 搜索所有index下指定type的数据
GET _all/type1,type2/_search

2 URI Search的用法

Elasticsearch支持通过在URI中携带请求参数执行搜索.

2.1 GET请求携带参数查询

比如要进行分页查询:

GET _search
{
"from": 0,
"size": 10
}

HTTP协议中一般不允许GET请求携带请求体 (Request Body), 但由于GET更加符合查询数据的操作, 因此可以携带Request Body. 而很多浏览器也都支持GET + Request Body模式.

如果遇到不支持GET + Request Body模式的场景, 也可以用POST方式查询, 比如:

POST _search
{
"from":0,
"size":10
}

或者使用拼接请求参数的方式进行查询:

GET _search?from=0&size=10

上述拼接的请求参数就是Query String, 这个串拼接的字段内容都是String, Elacticsearch底层会对各个field的类型进行映射.

2.2 URI Search的参数列表

参数 使用方法
q 查询字符串.
df 查询中没有定义前缀时, 默认的搜索字段.
analyzer 分析查询字符串所使用的分析器的名称.
lowercase_expanded_terms 搜索时忽略大小写标识, 默认为true.
analyze_wildcard 通配符或前缀查询是否被分析, 默认为false.
batched_reduce_size 协调节点需要减少的分片结果数. 当分片数量很多时, 会产生很大的内存开销, 这个参数用来当做保护机制.
default_operator 默认的多个条件之间的关系, 可以是 ANDOR. 默认是 OR.
lenient 如果设置为true, 字段类型转换失败时将忽略处理. 默认为false.
explain 在每个返回结果中, 将包含评分机制的详细计算描述.
_source 是否包含元数据, 同时支持_source_incude_source_exclude.
stored_fields 选择查询到的文档的指定字段, 多个之间用","分隔. 若不指定任何字段, 就不会返回任何字段.
sort 根据字段名排序. 可以是fieldName, 或fieldName:desc, 或fieldName:asc, 或_score (给予分数的排序). 可以有多个排序参数, 要注意各参数之间的顺序.
track_scores 跟踪评分. 排序时, 设置为true后将跟踪评分情况, 并在返回的结果中携带评分信息.
track_total_hits 设置为false, 禁止跟踪每个查询的结果总数. 默认为true, 即统计搜索到的结果总数.
timeout 搜索超时, 在指定的时间内执行搜索请求, 并在超时时间到期时返回查询到的已有结果. 默认无超时.
terminate_after 每个分片搜索的最大文档数, 如果达到此值, 即使搜索尚未结束, 当前分片将提前终止搜索.
如果设置, 响应信息中将携带一个boolean类型的terminated_early字段, 表示查询提前终止了. 默认没有设置.
from 从所有返回结果中的第几条开始显示, 默认为0.
size 搜索结果返回的条数. 默认为10, 即返回前10条.
search_type 搜索的类型, 可以是dfs_query_then_fetchquery_then_fetch, 默认是query_then_fetch.
allow_partial_search_results 如果请求将产生部分结果, 设置为false用来返回整体故障. 默认为true, 这将在超时或部分失败的情况下, 返回部分结果.
可以通过集群中的search.default_allow_partial_results来设置此参数.

2.3 URI Search用法示例

// 查询索引index1中、类型为type1、field1=test的所有文档
GET index1/type1/_search?q=field1:test // 查询索引index1中、类型为type1、必须满足field1=test的所有文档
GET index1/type1/_search?q=+test_field:test // 查询索引index1中、类型为type1、不满足field1=test的所有文档
GET index1/type1/_search?q=-test_field:test // 如果我们只想知道是否存在与查询条件相匹配的文档, 而对文档的具体信息不感兴趣, 此时可以设置size=0.
// 还可以设置terminate_after=1, 指明只要在每个shard中找到第一个匹配的文档, 就终止查询:
GET _search?q=field1:test&size=0&terminate_after=1

2.4 不指定field时的搜索原理

GET index1/type1/_search?q=test
// 同样, 可以使用"+"或"-"来控制是否包含某个关键字, 比如: 查询不包含java的所有文档:
GET shop/it_book/_search?q=-java

Elasticsearch默认为每个文档配置了_all元字段, 将各个文档的所有field的值用字符串拼接起来, 这个长字符串就作为_all字段的值, 同时建立索引.

查询时, 如果不指定关键字所属的field, ES将从_all字段中搜索, 所有文档中只要存在field包含指定的关键字, 就算作匹配, 并将作为结果返回. 举个例子:

// 文档内容如下:
{
"name": "Java并发编程的艺术",
"author": "方腾飞",
"date": "2015-07",
"publisher": "机械工业出版社"
}
// 搜索条件
GET shop/it_book/_search?q=java // 该文档_all字段的值为: "Java并发编程的艺术 方腾飞 2015-07 机械工业出版社", _all字段中包含java, 所以能够匹配.

说明: 生产环境中不建议开启_all, 也不建议通过_all字段进行查询操作.

在Elasticsearch 6.0版本中, _all字段已经被禁用了. 替代方案可以参考 这篇文章中的第3部分 .

版权声明

作者: 马瘦风

出处: 博客园 马瘦风的博客

感谢阅读, 如果文章有帮助或启发到你, 点个[好文要顶

ES 19 - Elasticsearch的检索语法(_search API的使用)的更多相关文章

  1. ElasticSearch(十五) _search api 分页搜索及deep paging性能问题

    1.分页搜索 语法: size,from GET /_search?size=10 GET /_search?size=10&from=0 GET /_search?size=10&f ...

  2. ElasticSearch(十四) _search api search timeout 机制

    语法:timeout=10ms,timeout=1s,timeout=1m GET /_search?timeout=10m timeout:默认无timeout,latency平衡completen ...

  3. ES 21 - Elasticsearch的高级检索语法 (包括term、prefix、wildcard、fuzzy、boost等)

    目录 1 term query - 索引词检索 1.1 term query - 不分词检索 1.2 terms query - in检索 2 prefix query - 前缀检索 3 wildca ...

  4. ES 13 - Elasticsearch的元字段 (_index、_type、_source、_routing等)

    目录 1 标识元字段 1.1 _index - 文档所属的索引 1.2 _uid - 包含_type和_id的复合字段 1.3 _type - 文档的类型 1.4 _id - 文档的id 2 文档来源 ...

  5. ES 07 - Elasticsearch查询文档的六种方法

    目录 1 Query String Search(查询串检索) 2 Query DSL(ES特定语法检索) 3 Query Filter(过滤检索) 4 Full Text Search(全文检索) ...

  6. 【原创】大数据基础之ElasticSearch(2)常用API整理

    Fortunately, Elasticsearch provides a very comprehensive and powerful REST API that you can use to i ...

  7. ES 32 - Elasticsearch 数据建模的探索与实践

    目录 1 什么是数据建模? 2 如何对 ES 中的数据进行建模 2.1 字段类型的建模方案 2.2 检索.聚合及排序的建模方案 2.3 额外存储的建模方案 3 ES 数据建模实例演示 3.1 动态创建 ...

  8. ElasticSearch进阶检索

    ElasticSearch进阶检索 入门检索中讲了如何导入elastic提供的样本测试数据,下面我们用这些数据进一步检索 一.SearchAPI ES 支持两种基本方式检索 : 1.一种是通过使用 R ...

  9. ElasticSearch之安装及基本操作API

    ElasticSearch 是目前非常流行的搜索引擎,对海量数据搜索是非常友好,并且在高并发场景下,也能发挥出稳定,快速特点.也是大数据和索搜服务的开发人员所极力追捧的中间件.虽然 ElasticSe ...

随机推荐

  1. C++string函数之strcat_s

    跟上一篇的strcpy_s一样,是新推出的较为安全的strcat函数 strcat_s脱胎于strcat,用于两个字符串的链接,strcat(str1,str2)直接返回新的str1. 但在vs200 ...

  2. mobile angualar ui的简单使用

    最近做一个微信App形式的业务平台,之前从别人的推荐文中知道了mobile angualar ui这个东西,这次纯做mobile Web就试用了一下,之前PCWeb中用过AngularJS,Hybri ...

  3. JavaScript 中的undefined and null 学习

    JavaScript 中的undefined and null learn record from the definitive guide to html5 JavaScript 中有两个特殊值:u ...

  4. unity做游戏常用功能实现(一)多方向同时输入也能让物体正常移动

    -------小基原创,转载请给我一个面子 网上有很多讲输入控制如何移动,但是多数都是讲单一按下,对于同时按下2个或2个以上按键并没有说明怎么解决,这里小基研究了一下方便大家 (如果你直接写input ...

  5. Bootstrap在线引用css和js

    百度在线调用 <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></ ...

  6. 关于Elasticsearch 使用 MatchPhrase搜索的一些坑

    对分词字段检索使用的通常是match查询,对于短语查询使用的是matchphrase查询,但是并不是matchphrase可以直接对分词字段进行不分词检索(也就是业务经常说的精确匹配),下面有个例子, ...

  7. cocos2d-x工作小记

    1.当一个layer跳到下一个layer时,需要传递数据,可以默认定义一个setUserData()方法. 2.cocos2d-x不使用传统的值类型,所有的对象都创建在堆上,然后通过指针引用. 3.传 ...

  8. URI和URL的区别 【转】

    源地址:http://www.cnblogs.com/gaojing/archive/2012/02/04/2413626.html 这两天在写代码的时候,由于涉及到资源的位置,因此,需要在Java ...

  9. Oracle数据库逻辑迁移之数据泵的注意事项

    环境:数据迁移,版本 11.2.0.4 -> 12.2.0.1 思考: 对于DBA而言,常用物理方式的迁移,物理迁移的优势不必多说,使用这种方式不必担心对象前后不一致的情况,而这往往也解决了不懂 ...

  10. sql中关于存在就不做操作的代码块

    前言: 在开发中,经常会对数据库表进行新增修改操作,那么如果表中的属性信息已然存在啦!就没必要去做重复的操作了... 代码块 BEGIN SELECT "COUNT"(*) int ...