映射 & 分析 & 领域特定语言查询(dsl)

概念 说明
映射(Mapping) 数据在每个字段中的解释说明
分析(Analysis) 全文是如何处理的可以被搜索的
领域特定语言查询(Query DSL) Elasticsearch使用的灵活的、强大的查询语言

多索引 & 多类别

通过限制搜索的不同索引或类型,可以在集群中跨所有文档搜索。

指定索引的搜索,可以是通配符的形式,也可以是多个索引:

1
2
3
4
/{index},{index}/{type},{type}/_search

# 通配符
/g*,u*/x*,y*/_search

分页

ES接受 from 和 size 参数进行分页查询:

  • from 跳过开始的结果数 默认0
  • size 结果数 默认10

例如:/_search?from=10&size=20

分页搜索方式

ES的搜索可能会涉及到多个分片,Elasticsearch 会转发搜索请求到这个索引的主分片或每个分片的复
制分片上,然后聚集每个分片的结果。假如搜索的size是10,那么ES会去检索每个分片上各自符合条件的数据进行排序,并返回10个结果,最后会在请求节点上对所有的结果进行排序并返回,以此保证最终结果的顺序正确。

在集群系统中深度分页
为了理解为什么深度分页是有问题的,假设在一个有5个主分片的索引中搜索。当请求结果的第一页(结果1到10)时,每个分片产生自己最顶端10个结果然后返回它们给请求节点(requesting node),它再排序这所有的50个结果以选出顶端的10个结果。现在假设请求第1000页——结果10001到10010。工作方式都相同,不同的是每个分片都必须产生顶端的10010个结果。然后请求节点排序这50050个结果并丢弃50040个!可以看到在分布式系统中,排序结果的花费随着分页的深入而成倍增长。这也是为什么网络搜索引擎中任何语句不能返回多于1000个结果的原因。

简易搜索 & 复杂搜索

search API有两种表单:

  • 一种是“简易版”的查询字符串(query string)将所有参数通过查询字符串定义
  • 另一种版本使用JSON完整的表示请求体(request body),这种富搜索语言叫做结构化查询语句(DSL)
1
2
3
4
5
# 查询 type类型的‘name’字段为tom的文档
GET /_all/{type}/_search?q=name:tom

# 包含与不包含:‘+’,‘-’
GET /_all/{type}/_search?q=+name:tom-name:jerry
1
2
3
# name 包含 ‘tom’或‘jerry’
# date 晚于 1993-01-20
q=+name:(tom,jerry)+date:>1993-01-20

这这搜索方式搜索不便之处在于:容易出现语法错误而导致返回错误的搜索结果以及慢查询。
因此,一般在生产环境中我们通常会使用请求体搜索API。