Elasticsearch - 搜索引擎入門

Elasticsearch是一個分佈式可擴展的實時搜索和分析引擎。它能幫助你搜索、分析和瀏覽數據,而往往大家並沒有在某個項目一開始就預料到需要這些功能。Elasticsearch之所以出現就是爲了重新賦予硬盤中看似無用的原始數據新的活力。

Elasticsearch每一個獨立的部分都不是新創的。比如全文搜索早就已經被實現,統計系統和分佈式數據庫也早已存在。但是革命之處在於能將這些

獨立的功能結合成一個連貫、實時處理的整體。對於新用戶,它的門檻也很低,當然他也會因爲你的強大而變得更強大。

很不幸的是,目前的大部分數據庫在提取數據方面都是非常的薄弱的。雖然它們可以通過精準的時間戳或者確切的數值來進行內容的篩選,但是它們可

以在全文搜索時做到同義詞或者相關性搜索嗎?他們可以彙總相同內容數據嗎?最重要的是,每對如此巨大的數據量,它們能做到實時處理嗎?

在Elasticsearch中,每一個字段都會默認被建立索引。也就是說,每一個字段都會有一個反向索引以便快速搜索。而且,與大多數其他數據庫不同的是

ES可以在同一個查詢中使用所有的反向索引,以驚人的速度返回查詢結果。這便是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批量查詢,減少網絡往返。


基本搜索請求格式

Method /{index}/{type}/{id}
{
"field": "value",
...
}


HEAD方法可以用來檢查文檔是否存在,加上-i參數獲取反饋頭文件。另外,在查詢字符串中帶上pretty參數,Elasticsearch就可以得到優美打印的更加易於識別的JSON結果。 _source 字段不會執行優美打印,它的樣子取決於我們錄入的樣子。


全文搜索

一項在傳統數據庫很難實現的功能。 我們將會搜索所有喜歡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" ]
	}
	}
	]
	}
	}


相關性評分
通常情況下,Elasticsearch會通過相關性來排列順序,第一個結果中,John Smith的 about 字段中明確地寫到rock climbing。而在Jane Smith的 about 字段中,提及到了rock,但是並沒有提及到climbing,所以後者的 _score 就要比前者的低。即所謂的相關性(與指定搜索查詢匹配程度的一個相對度量,得分越高,文檔越相關)

另外,計算得分會帶來一定的性能損耗,當不需要計算得分時,可以使用filter過濾器。這個例子很好地解釋了Elasticsearch是如何執行全文搜索的。對於Elasticsearch來說,相關性的感念是很重要的,而這也是它與傳統數據庫在返回匹配數據時最大的不同之處。


段落搜索

能夠找出每個字段中的獨立單詞固然很好,但是有的時候你可能還需要去匹配精確的短語或者段落。例如,我們只需要查詢到 about 字段只包含rock climbing的短語的員工。爲了實現這個效果,我們將對 match 查詢變爲 match_phrase 查詢進行精確匹配。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章