开源软件

基于 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 ,否则必究相关责任!

对这篇文章感觉如何?

太棒了
0
不错
0
爱死了
0
不太好
0
感觉很糟
0
雨落清风。心向阳

    You may also like

    Leave a reply

    您的邮箱地址不会被公开。 必填项已用 * 标注

    此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

    More in:开源软件

    开源软件

    在 Linux 终端中管理您的密码

    在信息时代,我们的所使用的密码只会越来越多,你是否遇到过密码太多而经常遗忘?所以应该如何高效地管理这些密码?本篇文章主要讲述了在我们拥有大量的密码时,在Linux终端下,使用 Pass 管理系统高效地管理密码,并为我们提供了详细的操作步骤,使我们更加快速熟悉地掌握如何使用 Pass,减少我们自己在以后的使用中的可能遇到的烦恼。
    开源软件

    用 Scribus 来进行排版吧!

    想不想制作一些亲手设计的小册子呢?来使用专业级的开源软件 Scribus 快捷排版吧!这款应用可以让你轻松地把创意落地成可打印的文档,无论在家、办公室还是专业的印刷厂都可以使用。在过程中也不会用到任何剪刀、胶水,完美契合不善动手的人。
    开源软件

    使用 pdftk-java 来编辑 PDF 吧!

    在用命令行处理大量 PDF 文件时,手动操作通常不是一个好的选择。这时候可以选择使用 pdftk-java 工具,配合上对应批量操作的 Makefile 文件,能让你事半功倍。
    开源软件

    来点更高雅的!用 Linux Sampler 演奏数字管弦乐

    一直以来,音乐合成器都在尝试模拟真实的乐器。然而在技术的发展中,合成音乐家们发现如果想真正地捕获到乐器的美感,只能去录制他们的声音,再通过技术合成手段来获得想要的音乐。如果你想要为自己的游戏或者其他应用来配上一段优美的音乐,聘请管弦乐队显然是非常昂贵的。但通过 Linux Sampler 这个开源程序,或者再加上一个 MIDI 键盘,也是可以实现一段成功的演奏的。