ElasticSearch[4]-正片:搜索
映射 & 分析 & 领域特定语言查询(dsl)
概念 | 说明 |
---|---|
映射(Mapping) | 数据在每个字段中的解释说明 |
分析(Analysis) | 全文是如何处理的可以被搜索的 |
领域特定语言查询(Query DSL) | Elasticsearch使用的灵活的、强大的查询语言 |
多索引 & 多类别
通过限制搜索的不同索引或类型,可以在集群中跨所有文档搜索。
指定索引的搜索,可以是通配符的形式,也可以是多个索引:
1 | /{index},{index}/{type},{type}/_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 | # 查询 type类型的‘name’字段为tom的文档 |
1 | # name 包含 ‘tom’或‘jerry’ |
这这搜索方式搜索不便之处在于:容易出现语法错误而导致返回错误的搜索结果以及慢查询。
因此,一般在生产环境中我们通常会使用请求体搜索API。