Elasticsearch用例:全文搜索
在本系列有關Elasticsearch用例的最后一篇文章中,我們介紹了Elasticsearch提供的用于存儲甚至大量文檔的功能 。 在這篇文章中,我們將研究其另一個核心功能:搜索。 我正在利用上一篇文章中的某些信息,因此,如果您還沒有閱讀過,則應該立即閱讀。
如我們所見,我們可以使用Elasticsearch存儲甚至可以分布在多臺機器上的JSON文檔。 索引用于對文檔進行分組,并且每個文檔都使用某種類型存儲。 分片用于在多個節點之間分配索引的一部分,副本是分片的副本,用于分配負載和容錯。
全文搜索
每個人都使用全文搜索。 僅通過導航和類別就無法訪問大量信息。 Google是提供大量信息即時關鍵詞搜索的最杰出的例子。
查看Google的功能,我們已經可以看到全文搜索的一些常見功能。 用戶僅提供關鍵字,并期望搜索引擎提供良??好的結果。 預計文檔的相關性很好,并且用戶希望在第一頁上獲得所需的結果。 文檔的相關性可能受不同因素的影響,例如查詢的術語存在于文檔中。 除了獲得最佳結果外,用戶還希望在搜索過程中得到支持。 建議和結果摘錄中的突出顯示等功能可以幫助實現這一目標。
搜索非常重要的另一個領域是電子商務,其中亞馬遜是主要參與者。
該界面看起來類似于Google的界面。 用戶可以輸入然后搜索的關鍵字。 但是也有細微的差異。 亞馬遜提供的建議更為高級,還暗示可能在其中找到術語的類別。結果顯示也有所不同,包括結構化的視圖。 所搜索文檔的結構還用于確定左側的構面,這些構面可用于基于某些條件過濾當前結果,例如,所有結果的成本在10到20歐元之間。 最后,當涉及到諸如在線商店之類的內容時,相關性可能意味著完全不同的東西。 通常,結果清單的順序會受到供應商的影響,或者用戶可以按價格或發布日期等標準對結果進行排序。
盡管Google和Amazon均未使用Elasticsearch,但您可以使用它來構建類似的解決方案。
在Elasticsearch中搜索
與其他所有內容一樣,可以使用HTTP搜索Elasticsearch。 在最簡單的情況下,可以將_search端點附加到URL并添加一個參數 : curl -XGET "http://localhost:9200/conferences/talk/_search?q=elasticsearch?tty=true" 。 然后,Elasticsearch將按照相關性對結果進行響應。
{"took" : 81,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 1,"max_score" : 0.067124054,"hits" : [ {"_index" : "conferences","_type" : "talk","_id" : "iqxb7rDoTj64aiJg55KEvA","_score" : 0.067124054,"_source":{"title" : "Anwendungsf?lle für Elasticsearch","speaker" : "Florian Hopf","date" : "2014-07-17T15:35:00.000Z","tags" : ["Java", "Lucene"], "conference" : {"name" : "Java Forum Stuttgart","city" : "Stuttgart"} }} ]} }盡管我們已經搜索了某種類型,但是您也可以搜索多種類型或多種索引。
添加參數很容易,但是搜索請求可能變得更加復雜。 我們可能會要求根據標準突出顯示或過濾文檔。 Elasticsearch并沒有為所有內容使用參數,而是提供了所謂的Query DSL ,這是在請求正文中傳遞并使用JSON表示的搜索API。
該查詢可能是用戶嘗試搜索elasticsearch但卻誤輸入了一部分的結果。 結果經過過濾,因此僅返回斯圖加特市的會議討論。
curl -XPOST "http://localhost:9200/conferences/_search " -d' {"query": {"match": {"title" : {"query": "elasticsaerch","fuzziness": 2}}},"filter": {"term": {"conference.city": "stuttgart"}} }'這次我們正在索引會議中查詢所有類型的所有文檔。 查詢對象請求一個常見查詢,即文檔標題字段上的匹配查詢 。 查詢屬性包含用戶將傳遞的搜索詞。 模糊屬性要求我們還應該查找包含與所請求術語相似的術語的文檔。 這將照顧到拼寫錯誤的術語,并返回包含elasticsearch的結果。 篩選器對象要求應根據會議所在的城市篩選所有結果。 應盡可能使用過濾器,因為它們可以被緩存,并且不計算相關性,這會使它們更快。
規范化文字
隨著搜索無處不在,用戶對它應該如何工作也抱有一些期望。 他們可能會使用僅與文檔中的術語相似的術語,而不是發布完全匹配的關鍵字。 例如,用戶可能正在查詢術語curl -XGET "http://localhost:9200/conferences/talk/_search?q=title:anwendungsfall?tty=true" ,該術語是所包含術語curl -XGET "http://localhost:9200/conferences/talk/_search?q=title:anwendungsfall?tty=true"的單數形式,這意味著用例在德語中: curl -XGET "http://localhost:9200/conferences/talk/_search?q=title:anwendungsfall?tty=true"
{"took" : 2,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 0,"max_score" : null,"hits" : [ ]} }沒有結果。 我們可以嘗試使用上面已經看到的模糊搜索來解決這個問題,但是有更好的方法。 我們可以在索引編制過程中對文本進行規范化,以便兩個關鍵字都指向文檔中的同一術語。
Lucene,Elasticsearch中的庫搜索和存儲是通過提供用于搜索的基礎數據結構,即反向索引來實現的。 術語會映射到它們所包含的文檔中。稱為分析的過程用于拆分傳入的文本并添加,刪除或修改術語。
在左側,我們可以看到兩個已建立索引的文檔,在右側,我們可以看到將術語映射到包含它們的文檔的倒排索引。在分析過程中,文檔的內容按照特定于應用程序的方式進行拆分和轉換因此可以將其放入索引中。 在這里,文本首先在空格或標點符號上分割。 然后所有字符都小寫。 在最后一步中,采用依賴于語言的詞干來嘗試找到術語的基本形式。 這就是將我們的Anwendungsf?lle轉變為Anwendungsfall的原因。
在分析期間執行哪種邏輯取決于您的應用程序數據。 分析過程是確定搜索質量的主要因素之一,您可以花很多時間進行搜索。 有關更多詳細信息,您可能需要看一下我關于索引數據的絕對基礎的文章。
在Elasticsearch中,如何分析字段取決于類型的映射。 上周,我們看到我們可以在Elasticsearch中索引不同結構的文檔,但是正如我們現在所看到的,Elasticsearch并非完全沒有架構。 某個領域的分析過程只能確定一次,并且不容易更改。 您可以添加其他字段,但通常不更改現有字段的存儲方式。
如果您不提供映射,Elasticsearch將對您索引的文檔進行一些有根據的猜測。 它將查看在索引編制過程中看到的任何新字段,并盡其所能。 就我們的標題而言,它使用StandardAnalyzer,因為它是一個字符串。 Elasticsearch不知道我們的字符串使用哪種語言,因此它不會進行任何詞干處理,這是一個很好的默認設置。
要告訴Elasticsearch使用GermanAnalyzer代替,我們需要添加一個自定義映射。 我們首先刪除索引,然后再次創建它:
curl -XDELETE "http://localhost:9200/conferences/"curl -XPUT "http://localhost:9200/conferences/“然后,我們可以使用PUT映射API傳入我們類型的映射。
curl -XPUT "http://localhost:9200/conferences/talk/_mapping" -d' {"properties": {"tags": {"type": "string","index": "not_analyzed"},"title": {"type": "string","analyzer": "german"}} }'我們僅提供了兩個字段的自定義映射。 Elasticsearch將再次猜測其余字段。 創建生產應用程序時,您很可能會預先映射所有字段,但不相關的字段也可以自動映射。 現在,如果我們再次為文檔建立索引并搜索單數,將找到該文檔。
高級搜索
除了我們在這里看到的功能外,Elasticsearch還提供了更多功能。 您可以使用聚合自動收集結果方面,我們將在以后的文章中介紹這些聚合。 建議者可用于為用戶執行自動建議,可突出顯示術語,可根據字段對結果進行排序,您可以對每個請求進行分頁……。 隨著Elasticsearch在Lucene的基礎上發展,構建高級搜索應用程序的所有優勢均已存在。
結論
搜索是Elasticsearch的核心部分,可以與其分布式存儲功能結合使用。 您可以使用DSL查詢來構建表達性查詢。 分析是搜索的核心部分,可以通過為類型添加自定義映射來影響分析。 Lucene和Elasticsearch提供了許多高級功能,可將搜索添加到您的應用程序中。
當然,由于Elasticsearch的搜索功能和分布特性,有很多用戶正在使用Elasticsearch。 GitHub使用它來讓用戶搜索存儲庫 , StackOverflow在Elasticsearch中索引其所有問題和答案 , SoundCloud則在歌曲的元數據中進行搜索。
在下一篇文章中,我們將研究Elasticsearch的另一方面:使用它來索引地理數據,這使您可以按位置和距離對結果進行過濾和排序。
翻譯自: https://www.javacodegeeks.com/2014/07/use-cases-for-elasticsearch-full-text-search.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Elasticsearch用例:全文搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程与信奥区别(编程与linux)
- 下一篇: 安卓手机刷机包通用版(安卓手机刷机包)