基于 Elasticsearch 构建搜索引擎
什么是 Elasticsearch ?
Elasticsearch 是一个实时搜索和分析引擎。它可以大规模的索引文档,同时允许你能够搜索到它们,并快速地对其进行分析。
Elasticsearch 能够被 Hadoop 集成,在大数据存储和大数据搜索与分析的方面实现协作。在这篇文章中,我将会简要地介绍它的工作原理,然后我会根据最近的一个项目去深入研究一些例子。
Elasticsearch 怎么工作?
Elasticsearch 的核心使用了 Lucene 引擎 。Lucene 是一个用于优化文档存储的 Java 引擎,它可以高效地搜索和检索与搜索项相匹配的文本项。
为什么需要 Elasticsearch 呢? Elasticsearch 为你提供了一个更低层次的 Lucene 引擎和更为简洁的 API ,它更具可扩展性,同时支持插件和其他一系列技术的集成。
首先介绍三个关键概念:
- 索引( index ):一个索引就是一个拥有相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来 标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,你能够创建任意多个索引。
-
类型( type ):在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组相同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台 并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
-
分片( shard ):一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有 10 亿文档的索引占据 1TB 的磁盘空间,而任一节点可能没有这样大的磁盘空间来存储或者单个节点处理搜索请求,响应会太慢。为了解决这个问题, Elasticsearch 提供了将索引划分成多片的能力,这些片叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引” 可以被放置到集群中的任何节点上。
快速开始
额……这些都知道,但你该如何去使用它? Elasticsearch 提供了一个非常简洁的 REST API ,你可以将文档写到 Elasticsearch , Elasticsearch 会自动构建索引,最后你可以使用查询语句将这些文档召回。
$ curl -XPUT 'http://localhost:9200/blog/page/1' -d '{
"author" : "Lewis",
"post_date" : "2016-07-15T10:00:00",
"content" : "This is my blog post on elasticsearch..."
}'
上面这条命令就直接构建了第一个索引。那么现在就让我们来详细看看各个字段是什么意思是。在主机和端口之后的 URL 中,我们有三个选项。blog 是索引的名称,而 page 则是我们前面讨论的类型( type ),数字 1 代表当前这份文档的 id 。
以下是结果的返回值:
{
"_shards" : {
"total" : 5,
"failed" : 0,
"successful" : 5
},
"_index" : "blog",
"_type" : "page",
"_id" : "1",
"_version" : 1,
"created" : true
}
这不仅回复显示了我们上面的执行结果,同时还显示了分片以及副本的情况。
所以,我们的文件现在已经被存储了,我们可以简单地重复这个过程来处理尽可能多的博客文章。
那么我们该如何查询呢?有两种查询 方法。下面分别展示了两种查询方式。
简单查询
$ curl -XGET 'http://localhost:9200/blog/_search?q=author:lewis'
复杂查询
curl -XGET 'http://localhost:9200/blog/page/_search' -d
'{
"query" : {
"term" : { "author" : "lewis" }
}
}'
Elasticsearch 将返回如下结果。
{
"_shards":{
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits":{
"total" : 1,
"hits" : [
{
"_index" : "blog",
"_type" : "page",
"_id" : "1",
"_source" : {
"user" : "Lewis",
"post_date" : "2016-07-15T10:00:00",
"content" : "This is my blog post on elasticsearch..."
}
}
]
}
}
还有有许多不同的参数和大量可以使用的搜索技术,这些都可以在官方文档中被找到。
Hadoop 集成优势
你有几个文件,然后索引它们,再执行一些搜索。听起来很棒,但在企业中,你不太可能使用这种方法;你更倾向于将 PB 级的数据存储存储在某个弹性存储集群中。
Elasticsearch 通过构建 elasticsearch-hadoop 使得一切变得非常简单。 通过映射 hadoop 分离的输入数据, Spark 的分区到 ES 的分片上解决分布式数据模型问题,这样做能够减少了数据拷贝,提高了性能。 数据能够位于同一台机器上,因为 ES-hadoop 可能会与 Hadoop 和 Spark 进行数据交互,这样防止了不必要的数据通过网络进行传输。
希望本文对 ES( Elasticsearch )的初次尝试者有用,本文向你展示了如何快速构建自己的搜索引擎!只需要你的一点点想象力和一个简易的 Web 前端,你很快就能与谷歌进行竞争了。O(∩_∩)O哈哈~
本文由 LinuxStory 志愿者 Sunling 翻译,更多详情请查看原文。
原文链接:http://www.lewisgavin.co.uk/Search-Engine-Elasticsearch/
转载请注明来自 LinuxStory ,否则必究相关责任!