国产精品久久久久久_欧美日韩中文字幕一区二区三区 _欧美日韩国产精品_综合久久五月天

【上海網(wǎng)絡(luò)優(yōu)化公司】使用Docker和Elasticsearch搭建全文本搜索引擎應(yīng)用

發(fā)布時(shí)間:2019-09-27 14:40:39訪問(wèn)人數(shù):作者:

喜歡記得轉(zhuǎn)發(fā)關(guān)注喲


給應(yīng)用添加快速、靈活的全文本搜索對(duì)誰(shuí)都不是一件容易的事情。許多主流數(shù)據(jù)庫(kù),如PostgreSQL和MongoDB,受限于查詢(xún)和索引結(jié)構(gòu),只提供基礎(chǔ)文本搜索能力。為了提供高效全文本搜索一般都需要一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)。Elasticsearch正是這樣一個(gè)能夠提供靈活性和快速全文本搜索能力的開(kāi)源數(shù)據(jù)庫(kù)。


本文采用Docker來(lái)設(shè)置依賴(lài)環(huán)境。Docker是目前較常見(jiàn)的容器化引擎,Uber、Spotify、ADP和Paypal都是用這個(gè)技術(shù),它的優(yōu)勢(shì)在于與操作系統(tǒng)無(wú)關(guān),可以運(yùn)行在Windows、macOS和Linux之上——寫(xiě)操作指南很容易。如果從來(lái)沒(méi)有用過(guò)Docker也沒(méi)問(wèn)題,本文會(huì)詳細(xì)提供配置文件。


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


1. 什么是Elasticsearch


現(xiàn)代應(yīng)用中全文本檢索是高請(qǐng)求負(fù)載的應(yīng)用。搜索功能也是比較困難完成的功能(許多大眾網(wǎng)站都有subpar功能,但不是返回很慢就是返回結(jié)果不準(zhǔn)確),大部分原因是因?yàn)榈讓訑?shù)據(jù)庫(kù):許多標(biāo)準(zhǔn)關(guān)系型數(shù)據(jù)庫(kù)只能提供基本字符串匹配功能,而對(duì)CONTAINS或者LIKE SQL查詢(xún)只能提供有限支持。


而本文提供的搜索應(yīng)用能夠提供:


快速:查詢(xún)結(jié)果應(yīng)該實(shí)時(shí)返回,提高用戶(hù)體驗(yàn)。


靈活:根據(jù)不同數(shù)據(jù)和使用場(chǎng)景,可以調(diào)整搜索過(guò)程。


較佳建議:對(duì)于輸入錯(cuò)誤,返回較可能的結(jié)果。


全文本:除了搜索關(guān)鍵詞和標(biāo)簽之外,希望能夠搜索到所有匹配文本。


實(shí)現(xiàn)以上要求的搜索應(yīng)用,較好采用一個(gè)為全文本檢索優(yōu)化的數(shù)據(jù)庫(kù),這也是本文采用Elasticsearch的原因。Elasticsearch是一個(gè)用Java開(kāi)發(fā)的,開(kāi)源的內(nèi)存數(shù)據(jù)庫(kù),較開(kāi)始是包含在Apache Lucene庫(kù)中。以下是一些官方給出的Elasticsearch使用場(chǎng)景:


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


Guardian使用Elasticsearch將訪問(wèn)者社交數(shù)據(jù)整合反饋給作者。


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


GitHub使用Elasticsearch在一千三百億行代碼中進(jìn)行搜索。


Elasticsearch有什么獨(dú)特之處


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


“索引”是一種在數(shù)據(jù)庫(kù)中提供快速查詢(xún)和返回的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)庫(kù)一般將數(shù)據(jù)域和相應(yīng)表位置生成索引信息。將索引信息存放在一個(gè)可搜索的數(shù)據(jù)結(jié)構(gòu)中(一般是B-Tree),數(shù)據(jù)庫(kù)可以為優(yōu)化數(shù)據(jù)請(qǐng)求獲得線性搜索響應(yīng)(例如“Find the row with ID=5”)。


可以把數(shù)據(jù)庫(kù)索引看做學(xué)校圖書(shū)館卡片分類(lèi)系統(tǒng),只要知道書(shū)名和作者,就可以準(zhǔn)確告訴查找內(nèi)容的入口。數(shù)據(jù)庫(kù)表一般都有多個(gè)索引表,可以加速查詢(xún)(例如,對(duì)name列的索引可以極大加速對(duì)特定name的查詢(xún))。


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


反向索引數(shù)據(jù)結(jié)構(gòu)對(duì)查詢(xún)“football”位于哪個(gè)文檔這種查詢(xún)非常迅速。Elasticsearch使用內(nèi)存優(yōu)化反向索引,可以實(shí)現(xiàn)強(qiáng)大和客制化全文本檢索任務(wù)。


2. 項(xiàng)目安裝


2.0 Docker


本文使用Docker作為項(xiàng)目開(kāi)發(fā)環(huán)境。Docker是一個(gè)容器化引擎,應(yīng)用可以運(yùn)行在隔離環(huán)境中,不依賴(lài)于本地操作系統(tǒng)和開(kāi)發(fā)環(huán)境。因?yàn)榭梢詭?lái)巨大靈活性和客制化,許多互聯(lián)網(wǎng)公司應(yīng)用都已經(jīng)運(yùn)行在容器中。


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


2.1 安裝Docker和Docker-Compose


本項(xiàng)目只需要Docker和Docker-Compose環(huán)境。后者是Docker官方工具,在單一應(yīng)用棧中編排定義多個(gè)容器配置。


安裝Docker——


安裝Docker Compose——


2.2 設(shè)置項(xiàng)目安裝目錄


創(chuàng)建一個(gè)項(xiàng)目根目錄(例如guttenberg_search),在其下定義兩個(gè)子目錄:


public——為前端 Vue.js webapp存放數(shù)據(jù)。


server——服務(wù)器端Node.js 源文件。


2.3 添加Docker-Compose配置文件


下一步,創(chuàng)建docker-compose.yml文件,定義應(yīng)用棧中每個(gè)容器的配置:


gs-api——Node.js 容器后端應(yīng)用邏輯.


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


gs-search——存儲(chǔ)搜索數(shù)據(jù)的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>


此文件定義應(yīng)用棧,而不需要在本地宿主機(jī)安裝Elasticsearch、Node.js、或者Nginx。每個(gè)容器都對(duì)宿主機(jī)開(kāi)放相應(yīng)端口,以便從宿主機(jī)訪問(wèn)和排錯(cuò)Node API,Elasticsearch實(shí)例和前端應(yīng)用。


2.4 添加Dockerfile


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


在應(yīng)用根目錄定義一個(gè)簡(jiǎn)單的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配置文件中將應(yīng)用源碼拷貝進(jìn)來(lái),安裝了NPM依賴(lài)包,形成了自己的鏡像。同樣需要添加一個(gè).dockerignore文件,避免不需要的文件被拷入。


node_modulesnpm-debug.logbookspublic<pre>注意:不需要將node_modules拷入,因?yàn)槲覀兒罄m(xù)要用npm install來(lái)安裝這些進(jìn)程。如果拷貝node_modules到容器中容易引起兼容性問(wèn)題。例如在macOS上安裝bcrypt包,如果將此module拷入U(xiǎn)buntu容器就會(huì)引起操作系統(tǒng)不匹配問(wèn)題。


2.5 添加基礎(chǔ)文件


測(cè)試配置文件前,還需要往應(yīng)用目錄拷入一下占位文件。在publicindex中加入如下基礎(chǔ)配置信息:


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


下一步,在serverapp.js中加入Node.js的應(yīng)用文件。


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


較后,加入package.json節(jié)點(diǎn)配置文件:


{"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>


此文件定義應(yīng)用開(kāi)始命令和Node.js依賴(lài)包。


注意:不需要特意運(yùn)行npm install,容器創(chuàng)建時(shí)候會(huì)自動(dòng)安裝依賴(lài)包。


2.6 開(kāi)始測(cè)試


都準(zhǔn)備好了,接下來(lái)可以測(cè)試了。從項(xiàng)目根目錄開(kāi)始,運(yùn)行docker-compose,會(huì)自動(dòng)創(chuàng)建Node.js容器應(yīng)用。


運(yùn)行docker-compose up啟動(dòng)應(yīng)用:


注意:這一步可能會(huì)運(yùn)行時(shí)間比較長(zhǎng),因?yàn)镈ocker可能需要下載基礎(chǔ)鏡像。以后執(zhí)行速度會(huì)很快,因?yàn)楸镜匾呀?jīng)有了基礎(chǔ)鏡像。


訪問(wèn)localhost:8080,應(yīng)該看到如下圖輸出“hello world”。


訪問(wèn)localhost:3000驗(yàn)證服務(wù)器端返回“hello world”信息。


較后,訪問(wèn)localhost:9200確認(rèn)Elasticsearch是否運(yùn)行,如果正常,應(yīng)該返回如下輸出:


{"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輸出都正常,恭喜,整個(gè)應(yīng)用框架可以正常工作,下面開(kāi)始進(jìn)入真正有趣的部分了。


贊+1

華夕網(wǎng)絡(luò) 版權(quán)所有 Copyright ? 2012-2018 www.xiaoshi-su.com All Rights Reserved .   備案號(hào):滬ICP備15005556號(hào)-3    網(wǎng)站地圖    代理商查詢(xún)

  • QQ
  • 電話
  • 首頁(yè)
  • 留言
  • 返回頂部
  • zxly.png