Elasticsearch搜索引擎入門

jopen 9年前發布 | 23K 次閱讀 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 查詢進行精確匹配。


來自:http://blog.csdn.net/xifeijian/article/details/49611909

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!