山东麻将怎么算番|山东麻将群1元麻将群

【上海網絡優化公司】使用Docker和Elasticsearch搭建全文本搜索引擎應用

發布時間:2019-09-27 14:40:39訪問人數:作者:

喜歡記得轉發關注喲


給應用添加快速、靈活的全文本搜索對誰都不是一件容易的事情。許多主流數據庫,如PostgreSQL和MongoDB,受限于查詢和索引結構,只提供基礎文本搜索能力。為了提供高效全文本搜索一般都需要一個獨立的數據庫。Elasticsearch正是這樣一個能夠提供靈活性和快速全文本搜索能力的開源數據庫。


本文采用Docker來設置依賴環境。Docker是目前較常見的容器化引擎,Uber、Spotify、ADP和Paypal都是用這個技術,它的優勢在于與操作系統無關,可以運行在Windows、macOS和Linux之上——寫操作指南很容易。如果從來沒有用過Docker也沒問題,本文會詳細提供配置文件。


本文也分別采用Node.js采(用Koa框架)和Vue.js創建搜索API和前端Web應用。


1. 什么是Elasticsearch


現代應用中全文本檢索是高請求負載的應用。搜索功能也是比較困難完成的功能(許多大眾網站都有subpar功能,但不是返回很慢就是返回結果不準確),大部分原因是因為底層數據庫:許多標準關系型數據庫只能提供基本字符串匹配功能,而對CONTAINS或者LIKE SQL查詢只能提供有限支持。


而本文提供的搜索應用能夠提供:


快速:查詢結果應該實時返回,提高用戶體驗。


靈活:根據不同數據和使用場景,可以調整搜索過程。


較佳建議:對于輸入錯誤,返回較可能的結果。


全文本:除了搜索關鍵詞和標簽之外,希望能夠搜索到所有匹配文本。


實現以上要求的搜索應用,較好采用一個為全文本檢索優化的數據庫,這也是本文采用Elasticsearch的原因。Elasticsearch是一個用Java開發的,開源的內存數據庫,較開始是包含在Apache Lucene庫中。以下是一些官方給出的Elasticsearch使用場景:


Wikipedia使用Elasticsearch提供全文檢索,提供高亮顯示、search-as-you-type和did-you-mean建議等功能。


Guardian使用Elasticsearch將訪問者社交數據整合反饋給作者。


Stack Overflow將位置信息和more-like-this功能與全文本檢索整合提供相關問題和答案。


GitHub使用Elasticsearch在一千三百億行代碼中進行搜索。


Elasticsearch有什么獨特之處


本質上,Elasticsearch通過使用反向索引提供快速和靈活的全文本搜索。


“索引”是一種在數據庫中提供快速查詢和返回的數據結構。數據庫一般將數據域和相應表位置生成索引信息。將索引信息存放在一個可搜索的數據結構中(一般是B-Tree),數據庫可以為優化數據請求獲得線性搜索響應(例如“Find the row with ID=5”)。


可以把數據庫索引看做學校圖書館卡片分類系統,只要知道書名和作者,就可以準確告訴查找內容的入口。數據庫表一般都有多個索引表,可以加速查詢(例如,對name列的索引可以極大加速對特定name的查詢)。


而反向索引工作原理與此完全不同。每行(或者每個文檔)的內容被分拆,每個入口(本案例中是每個單詞)反向指向包含它的文檔。


反向索引數據結構對查詢“football”位于哪個文檔這種查詢非常迅速。Elasticsearch使用內存優化反向索引,可以實現強大和客制化全文本檢索任務。


2. 項目安裝


2.0 Docker


本文使用Docker作為項目開發環境。Docker是一個容器化引擎,應用可以運行在隔離環境中,不依賴于本地操作系統和開發環境。因為可以帶來巨大靈活性和客制化,許多互聯網公司應用都已經運行在容器中。


對于作者來說,Docker可以提供平臺一致性安裝環境(可以運行在Windows、macOS和Linux系統)。一般Node.js、Elasticsearch和Nginx都需要不同安裝步驟,如果運行在Docker環境中只需要定義好不同配置文件,就可以運行在任何Docker環境。另外,由于應用各自運行在隔離容器中,與本地宿主機關系很小,因此類似于“但是我這可以運行啊”這種排錯問題就很少會出現。


2.1 安裝Docker和Docker-Compose


本項目只需要Docker和Docker-Compose環境。后者是Docker官方工具,在單一應用棧中編排定義多個容器配置。


安裝Docker——


安裝Docker Compose——


2.2 設置項目安裝目錄


創建一個項目根目錄(例如guttenberg_search),在其下定義兩個子目錄:


public——為前端 Vue.js webapp存放數據。


server——服務器端Node.js 源文件。


2.3 添加Docker-Compose配置文件


下一步,創建docker-compose.yml文件,定義應用棧中每個容器的配置:


gs-api——Node.js 容器后端應用邏輯.


gs-frontend——為前端webapp提供服務的Nginx容器


gs-search——存儲搜索數據的Elasticsearch容器


version: '3'services:api: # Node.js Appcontainer_name: gs-apibuild: .ports: - "3000:3000" # Expose API port - "9229:9229" # Expose Node process debug port (disable in productionenvironment: # Set ENV vars - NODE_ENV=local - ES_HOST=elasticsearch - PORT=3000volumes: # Attach local book data directory - .books:usrsrcappbooksfrontend: # Nginx Server For Frontend Appcontainer_name: gs-frontendimage: nginxvolumes: # Serve local "public" dir - .public:usrsharenginxports: - "8080:80" # Forward site to localhost:8080elasticsearch: # Elasticsearch Instancecontainer_name: gs-searchimage: docker.elastic.coelasticsearchelasticsearch:6.1.1volumes: # Persist ES data in seperate "esdata" volume - esdata:usrshareelasticsearchdataenvironment: - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - discovery.type=single-nodeports: # Expose Elasticsearch ports - "9300:9300" - "9200:9200"volumes: # Define seperate volume for Elasticsearch dataesdata:<pre>


此文件定義應用棧,而不需要在本地宿主機安裝Elasticsearch、Node.js、或者Nginx。每個容器都對宿主機開放相應端口,以便從宿主機訪問和排錯Node API,Elasticsearch實例和前端應用。


2.4 添加Dockerfile


本文使用官方的Nginx和Elasticsearch鏡像,但是需要重新為Node.js創建自己的鏡像。


在應用根目錄定義一個簡單的Dockerfile配置文件。


# Use Node v8.9.0 LTSFROM node:carbonSetup app working directoryWORKDIR usrsrcappCopy package.json and package-lock.jsonCOPY package*.json .Install app dependenciesRUN npm installCopy sourcecodeCOPY . .Start appCMD [ "npm", "start" ]<pre>


此Docker配置文件中將應用源碼拷貝進來,安裝了NPM依賴包,形成了自己的鏡像。同樣需要添加一個.dockerignore文件,避免不需要的文件被拷入。


node_modulesnpm-debug.logbookspublic<pre>注意:不需要將node_modules拷入,因為我們后續要用npm install來安裝這些進程。如果拷貝node_modules到容器中容易引起兼容性問題。例如在macOS上安裝bcrypt包,如果將此module拷入Ubuntu容器就會引起操作系統不匹配問題。


2.5 添加基礎文件


測試配置文件前,還需要往應用目錄拷入一下占位文件。在publicindex中加入如下基礎配置信息:


><body>Hello World From The Frontend Container<body><><pre>


下一步,在serverapp.js中加入Node.js的應用文件。


{if (err console.error(errconsole.log(`App Listening on Port ${port}`}<pre>


較后,加入package.json節點配置文件:


{"name": "guttenberg-search","version": "0.0.1","description": "Source code for Elasticsearch tutorial using 100 classic open source books.","scripts": {"start": "node --inspect=0.0.0.0:9229 serverapp.js"},"repository": {"type": "git","url": "git+ "","license": "MIT","bugs": {"url": " " {"elasticsearch": "13.3.1","joi": "13.0.1","koa": "2.4.1","koa-joi-validate": "0.5.1","koa-router": "7.2.1"}}<pre>


此文件定義應用開始命令和Node.js依賴包。


注意:不需要特意運行npm install,容器創建時候會自動安裝依賴包。


2.6 開始測試


都準備好了,接下來可以測試了。從項目根目錄開始,運行docker-compose,會自動創建Node.js容器應用。


運行docker-compose up啟動應用:


注意:這一步可能會運行時間比較長,因為Docker可能需要下載基礎鏡像。以后執行速度會很快,因為本地已經有了基礎鏡像。


訪問localhost:8080,應該看到如下圖輸出“hello world”。


訪問localhost:3000驗證服務器端返回“hello world”信息。


較后,訪問localhost:9200確認Elasticsearch是否運行,如果正常,應該返回如下輸出:


{"name" : "SLTcfpI","cluster_name" : "docker-cluster","cluster_uuid" : "iId8e0ZeS_mgh9ALlWQ7-w","version" : {"number" : "6.1.1","build_hash" : "bd92e7f","build_date" : "2019-12-17T20:23:25.338Z","build_snapshot" : false,"lucene_version" : "7.1.0","minimum_wire_compatibility_version" : "5.6.0","minimum_index_compatibility_version" : "5.0.0"},"tagline" : "You Know, for Search"}<pre>


如果所有URL輸出都正常,恭喜,整個應用框架可以正常工作,下面開始進入真正有趣的部分了。


贊+1

華夕網絡 版權所有 Copyright ? 2012-2018 www.kcdewx.tw All Rights Reserved .   備案號:滬ICP備15005556號     網站地圖    代理商查詢

  • QQ
  • 電話
  • 首頁
  • 留言
  • 返回頂部
  • zxly.png

    山东麻将怎么算番 河南麻将游戏单机版 友乐广西麻将官网 53皇冠比分 007球探比分网& 福建八闽麻将最新版本 通配资 无锡股票配资 江苏e足彩球走势图 大连微信红包麻将群 鑫东财配资 黑龙江6+1 北单比分直播新浪爱彩 下载qq麻将游戏 nba比分最大分差是多少 cba总决赛历史比分 二人麻将牌型图解