编程随笔-ElasticSearch知识导图(4):搜索
1. 原理
全文搜索是ES的核心功能。ES中的数据按数据特性可分为两类:确切值及全文文本。ES中如keyword,date这些类型的值都可视为确切值。而text类型的值则视为全文文本数据。为了对全文文本进行搜索,ES使用分析器(analyzer,根据不同自然语言、不同要求选择不同的分析器)将文本分析为单独的词(英文为terms或tokens,这里符合中国人的习惯,称为词),然后根据分词结果创建倒排索引(inverted index)。倒排索引以文本中的词为键,该词在文档中出现位置为值的一个数据结构,不同于常见的以文档序号(或标题)为键,文档内容为值的索引形式,所以称为倒排索引。ES中文档对象是一个结构化的JSON数据对象,每一个JSON文档中被索引的字段都有自己的倒排索引,全文搜索即在倒排索引中搜索。 ES中,分布式搜索操作需要分散到所有相关的分片中,然后收集所有的结果。对于一个搜索请求,搜索结果在不同分片中的分布密度可能是不同的,有可能出现一个分片包括了90%的记录,而其它分片却只包含极少记录的情况。当需要对搜索结果排序时,也需要从各独立的分片中收集到所有的搜索结果后再统一进行排序,这个过程类似于map-reduce的混洗(shuffle)过程。对于大数据集,这个过程可能会非常昂贵。因而在创建数据模型和设计搜索指令时我们应考虑搜索效率。 ES将搜索请求执行分为两阶段:在阶段查询(query)阶段,每个涉及搜索的分片执行搜索请求,获取本地搜索记录的排序后列表,并把这些可供协调节点(coordinating node)进行全局排序等操作的元数据信息返回给协调节点。在第二阶段取回(fetch)阶段,协调节点仅向包含搜索结果的分片请求具体的文档对象返回给用户。
2. 搜索API
ES提供了强大的数据搜索能力,在API级别提供基于URI和基于请求消息体两种搜索操作方式。
2.1. 基于URI的搜索
2.1.1. 基本格式
基于URI的搜索使用一个HTTP的GET请求携带搜索请求参数。搜索参数为(key,value)形式的名值对,以”&”连接。如果搜索请求中不带搜索参数则表示搜索所有记录。 仍以《编程随笔-ElasticSearch知识导图(3):映射》中第2节中的银行账号索引为例,先来看一个使用URI的搜索请求:
curl -iXGET 'localhost:9200/bank/_search?pretty&q=(firstname:Amber)AND(lastname:Duke)'
相关文章