Elasticsearch - 搜索引擎入门

Elasticsearch是一个分布式可扩展的实时搜索和分析引擎。它能帮助你搜索、分析和浏览数据,而往往大家并没有在某个项目一开始就预料到需要这些功能。Elasticsearch之所以出现就是为了重新赋予硬盘中看似无用的原始数据新的活力。

Elasticsearch每一个独立的部分都不是新创的。比如全文搜索早就已经被实现,统计系统和分布式数据库也早已存在。但是革命之处在于能将这些独立的功能结合成一个连贯、实时处理的整体。对于新用户,它的门槛也很低,当然他也会因为你的强大而变得更强大。

很不幸的是,目前的大部分数据库在提取数据方面都是非常的薄弱的。虽然它们可以通过精准的时间戳或者确切的数值来进行内容的筛选,但是它们可以在全文搜索时做到同义词或者相关性搜索吗?他们可以汇总相同内容数据吗?最重要的是,每对如此巨大的数据量,它们能做到实时处理吗?

这便是Elasticsearch如此突出的理由:Elasticsearch可以帮助你浏览并利用已经快要烂在数据库里的那些极难查询的数据。

了解搜索

Elasticsearch是一个建立在全文搜索引擎Apache Lucene(TM)基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。但是Lucene只是一个框架,要充分利用它的功能,你需要使用JAVA,并且在你的程序中集成Lucene。更糟的是,你需要做很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。

Elasticsearch使用Lucene作为内部引擎,但是在你使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作:
分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
实时分析的分布式搜索引擎。
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与ES的RESTful API进行交流,默认端口为9200,可以在配置文件中修改。

面向文档

程序中的对象很少是单纯的键值与数值的列表。更多的时候它拥有一个复杂的结构,比如包含了日期、地理位置、对象、数组等。
迟早你会把这些对象存储在数据库中。你会试图将这些丰富而又庞大的数据都放到一个由行与列组成的关系数据库中,然后你不得不根据每个字段的格式来调整数据,然后每次重建它你都要检索一遍数据。

Elasticsearch是面向文档型数据库,这意味着它存储的是整个对象或者文档,它不但会存储它们,还会为他们建立索引,这样你就可以搜索他们了。你可以在Elasticsearch中索引、搜索、排序和过滤这些文档。不需要成行成列的数据。这将会是完全不同的一种面对数据的思考方式,这也是为什么Elasticsearch可以执行复杂的全文搜索的原因。

Elasticsearch使用JSON (或称作JavaScript Object Notation )作为文档序列化的格式。JSON已经被大多数语言支持,也成为NoSQL领域的一个标准格式。它简单、简洁、易于阅读。在Elasticsearch中,将对象转换为JSON并作为索引要比在表结构中做相同的事情简单多了。

ES可以通过curl以get post delete等方式进行数据操作,或者通过match匹配、filter过滤器、range范围查询、布尔查询、aggregations(取代facet)聚合等方式,官方网站(https://www.elastic.co/guide/index.html)有丰富的查询示例。同样,它支持bulk api批量查询,减少网络往返。

全文搜索

一项在传统数据库很难实现的功能。 我们将会搜索所有喜欢rock climbing的员工:

GET /megacorp/employee/_search
{
	"query" : {
	"match" : {
	"about" : "rock climbing"
	}
	}
}

你会发现我们同样使用了 match 查询来搜索 about 字段中的rock climbing。我们会得到两个匹配的文档:

{
...
"hits": {
"total": 2,
"max_score": 0.16273327,
"hits": [
	{
	...
	"_score": 0.16273327, <1>
	"_source": {
	"first_name": "John",
	"last_name": "Smith",
	"age": 25,
	"about": "I love to go rock climbing",
	"interests": [ "sports", "music" ]
	}
	},
	{
	...
	"_score": 0.016878016, <1>
	"_source": {
	"first_name": "Jane",
	"last_name": "Smith",
	"age": 32,
	"about": "I like to collect rock albums",
	"interests": [ "music" ]
	}
	}
	]
	}
	}

1. 相关评分
通常情况下,Elasticsearch会通过相关性来排列顺序,第一个结果中,John Smith的 about 字段中明确地写到rock climbing。而在Jane Smith的 about 字段中,提及到了rock,但是并没有提及到climbing,所以后者的 _score 就要比前者的低。即所谓的相关性(与指定搜索查询匹配程度的一个相对度量,得分越高,文档越相关)

另外,计算得分会带来一定的性能损耗,当不需要计算得分时,可以使用filter过滤器。这个例子很好地解释了Elasticsearch是如何执行全文搜索的。对于Elasticsearch来说,相关性的感念是很重要的,而这也是它与传统数据库在返回匹配数据时最大的不同之处。

段落搜索

能够找出每个字段中的独立单词固然很好,但是有的时候你可能还需要去匹配精确的短语或者段落。例如,我们只需要查询到 about 字段只包含rock climbing的短语的员工。为了实现这个效果,我们将对 match 查询变为 match_phrase 查询进行精确匹配。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 23:40:03

Elasticsearch - 搜索引擎入门的相关文章

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到输入的搜索词设置一个数组里存放搜素词,判断搜索词在数组里是否存在如果存在删除原来的词,重新将新词放在数组最前面如果不存在直接将新词放在数组最前面即可,然后循环数组显示结果即可 热门搜索实现原理,当用户搜索一个词时,可以保存到数据库,然后记录搜索次数,利用redis缓存搜索次数最到的词,过一段时间更新

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_time = (end_time-start_time).total_seconds()结束时间减去开始时间等于用时,转换成秒 from django.shortcu

第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html 创建自动补全字段 自动补全需要用到一个字段名称为suggest类型为Completion类型的一个字段 所以我们需要用

第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的查询

第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的查询 elasticsearch(搜索引擎)的查询 elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据 查询分类: 基本查询:使用elasticsearch内置的查询条件进行查询 组合查询:把多个查询条件组合在一起进行复合查询 过滤:查询同时,通过filter条件在不影响打分的情况下筛选数据

第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作

第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)基本的索引和文档CRUD操作 elasticsearch(搜索引擎)基本的索引和文档CRUD操作 也就是基本的索引和文档.增.删.改.查.操作 注意:以下操作都是在kibana里操作的

转:ElasticSearch 简单入门

原文来自于:http://www.oschina.net/translate/elasticsearch-getting-started?cmp 教程样例 我们将要部署一个非常简单的应用--在一个部门里的雇员--这样我们可以把注意力放在功能而不是氧立得复杂性上.总而言之,这篇博文是为了帮助人们开始ElasticSearch入门. 1)现在打开你的cygwin窗口并且键入命令 curl -XPUT 'http://localhost:9200/dept/employee/32' -d '{ "em

五十 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到输入的搜索词设置一个数组里存放搜素词,判断搜索词在数组里是否存在如果存在删除原来的词,重新将新词放在数组最前面如果不存在直接将新词放在数组最前面即可,然后循环数组显示结果即可 热门搜索实现原理,当用户搜索一个词时,可以保存到数据库,然后记录搜索次数,利用redis缓存搜索次数最到的词,过一段时间更新

四十一 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查

elasticsearch(搜索引擎)基本的索引和文档CRUD操作 也就是基本的索引和文档.增.删.改.查.操作 注意:以下操作都是在kibana里操作的 elasticsearch(搜索引擎)都是基于http方法来操作的 GET 请求指定的页面信息,并且返回实体主体 POST 向指定资源提交数据进行处理请求,数据被包含在请求体中,POST请求可能会导致新的资源的建立和/或已有资源的修改 PUT 向服务器传送的数据取代指定的文档的内容 DELETE 请求服务器删除指定的页面 1.索引初始化,相当