Elasticsearch 文檔檢索系統

學習筆記:Elasticsearch 文檔檢索系統

1. 技術棧與核心組件

  • Node.js:后端運行環境,適合構建高性能 Web 服務。
  • Express:Node.js 的 Web 框架,簡化 API 開發。
  • Elasticsearch:分布式全文檢索引擎,支持高效的文本檢索。
  • 原生 HTML+JS:前端頁面實現,便于快速演示和交互。

2. 后端實現要點

  • API 設計

    • /import:導入本地 JSON 文檔到 Elasticsearch,支持批量操作。
    • /search:根據關鍵詞檢索文檔,支持多字段(標題、內容)全文檢索。
  • Elasticsearch 客戶端

    • 使用 @elastic/elasticsearch npm 包連接本地 ES 服務。
    • 索引管理:每次導入前先刪除舊索引,保證數據一致性。
    • 字段映射(Mapping):定義文檔結構,指定哪些字段可檢索。
  • 批量導入

    • 通過 bulk API 一次性導入多條文檔,提升效率。
  • CORS 跨域

    • 使用 cors 中間件,允許前端頁面直接訪問后端 API。
// =========================
// 導入文檔到 Elasticsearch
// =========================
app.post('/import', async (req, res) => {try {// 1. 檢查索引是否存在,存在則先刪除(保證每次導入都是全新數據)const exists = await esClient.indices.exists({ index: esIndex });// exists.body 為 true 表示索引存在,需先刪除if (exists.body) {await esClient.indices.delete({ index: esIndex });}// 2. 創建新索引,并定義字段映射await esClient.indices.create({index: esIndex,body: {mappings: {properties: {id: { type: 'integer' }, // 文檔IDtitle: { type: 'text' }, // 標題,全文檢索content: { type: 'text' } // 內容,全文檢索}}}});// 3. 讀取本地 docs.json 文件,獲取10篇文檔const docs = JSON.parse(fs.readFileSync(path.join(__dirname, 'docs.json'), 'utf-8'));// 4. 構造批量導入 bodyconst body = docs.flatMap(doc => [{ index: { _index: esIndex, _id: doc.id } }, doc]);// 5. 批量導入文檔到 ESawait esClient.bulk({ refresh: true, body });res.json({ success: true, message: '導入成功', count: docs.length });} catch (err) {// 錯誤處理res.status(500).json({ success: false, error: err.message });}
});// =========================
// 查詢接口:根據關鍵詞檢索文檔
// =========================
app.get('/search', async (req, res) => {const q = req.query.q || ''; // 獲取查詢參數try {// 調用 ES 的 search API,multi_match 支持多個字段全文檢索const result = await esClient.search({index: esIndex,body: {query: {multi_match: {query: q,fields: ['title', 'content'] // 在標題和內容中查找}}}});// 取出命中結果,提取需要的字段const hits = result.hits.hits.map(hit => ({id: hit._source.id,title: hit._source.title,content: hit._source.content,score: hit._score // 相關性分數}));res.json({ success: true, data: hits });} catch (err) {// 錯誤處理res.status(500).json({ success: false, error: err.message });}
});

3. 前端實現要點

  • 頁面結構

    • 搜索輸入框 + 按鈕,用戶輸入關鍵詞后觸發檢索。
    • 結果區域動態渲染檢索到的文檔列表。
  • 與后端交互

    • 使用 fetch 發送 GET 請求到 /search,獲取 JSON 格式結果。
    • 處理異常和無結果情況,提升用戶體驗。
  • 界面美化

    • CSS 實現響應式布局和美觀樣式,適配不同屏幕。
      在這里插入圖片描述

4. 數據結構與流程

  • 文檔結構

    • 每條文檔包含 idtitlecontent 字段。
    • 示例數據存儲于 backend/docs.json
  • 檢索流程

    1. 用戶輸入關鍵詞,點擊搜索。
    2. 前端調用后端 /search 接口。
    3. 后端在 ES 中檢索,返回相關文檔及分數。
    4. 前端展示檢索結果。

5. 常見問題與調試

  • Elasticsearch 未啟動:后端無法連接 ES,需先啟動本地 ES 服務。
  • 端口沖突:確保 3001 端口未被占用。
  • 跨域問題:已通過 CORS 解決,前后端可分開運行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90612.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何準確查看服務器網絡的利用率?

在服務器運維與性能調優過程中,網絡利用率是一個不容忽視的關鍵指標。它反映了服務器帶寬資源的實際使用情況,是判斷系統瓶頸、規劃資源擴展、排查連接問題的重要依據。很多人誤以為網絡是否正常只要“能上網”或“Ping得通”就可以了,實際上…

掌握Spring聲明式事務傳播機制:AOP與ThreadLocal的協同工作

聲明式事務的傳播機制是解決多個事務方法嵌套調用時,事務如何創建、復用、掛起或隔離的核心邏輯。它的實現依賴于事務管理器、事務狀態管理、線程上下文綁定等組件的協同,本質是通過一套 “規則判斷 狀態維護” 的邏輯,在方法調用時動態決定…

@Transactional事務注解的批量回滾機制

關鍵機制說明:1.??事務注解生效??:Transactional(rollbackFor Exception.class)Override Transactional(rollbackFor Exception.class) public Boolean saveUser(UserDTO userDto) {SysUser sysUser new SysUser();BeanUtils.copyProperties(user…

飛算 JavaAI 深度體驗:開啟 Java 開發智能化新紀元

個人主頁:?喜歡做夢 歡迎 👍點贊 ?關注 ??收藏 💬評論 目錄 一、引言 二、飛算 JavaAI 初印象與功能概覽 (一)初識飛算 JavaAI (二)核心功能模塊概覽 三、智能代碼生成功能深度體…

pandas銷售數據分析

pandas銷售數據分析 數據保存在data目錄 消費者數據:customers.csv商品數據:products.csv交易數據:transactions.csv customers.csv數據結構:字段描述customer_id客戶IDgender性別age年齡region地區membership_date會員日期produc…

訪問Windows服務器備份SQL SERVER數據庫

以前沒有直接訪問過Windows服務器,今天剛一看到的是時候有點懵,竟然下意識的使用SecureCRT遠程工具去連了一下,然后領導說,看一下用戶名,突然意識到,跟我們平時遠程桌面是一樣的。 一、 win + R 打開命令窗口 二、 輸入 mstsc 三、 輸入遠程地址 四、點擊連接,如果有彈…

C++ 面向對象 - 對象定義方法匯總

C對象定義方法匯總 1. 棧上定義方式 1.1 調用無參構造函數的定義方式 無參構造函數有兩種: 默認無參構造函數Demo(){}默認值列表構造函數。Demo():a{1},b{2}{} // 使用初始化列表實現對象定義方式: Demo d; Demo d1{}; // 以下定義方式還調用了拷貝構造…

指尖上的魔法:優雅高效的Linux命令手冊

一、Linux基礎指令 1. ls ls:對于目錄,列出該目錄下的所有子目錄與文件,對于文件,將列出文件名以及其他信息。 -a:列出目錄下的所有文件,包含以.開頭的隱藏文件 -l:列出文件的詳細信息 -d:將目錄…

《磁力下載工具實測:資源搜索+高速下載一站式解決方案》

嘿,朋友們!我是阿燦,今天給大家帶來一個超實用的看片神器,特別適合老司機們使用,保證讓你眼前一亮!推薦一款比某雷更好用的下載工具,搭配資源搜索神器,輕松獲取資源不限速。超強磁力…

Go網絡編程基礎:網絡模型與協議棧概述 - 從理論到實踐的完整指南

1. 引言 在當今的互聯網時代,網絡編程已經成為后端開發的核心技能。Go語言以其出色的并發性能和簡潔的語法,在網絡編程領域展現出了強大的優勢。從Docker、Kubernetes到眾多微服務框架,Go已經成為構建高性能網絡應用的首選語言之一。 你是否…

Web攻防-SSTI服務端模版注入利用分類語言引擎數據渲染項目工具挖掘思路

知識點: 1、WEB攻防-SSTI-利用分類&功能點 2、WEB攻防-SSTI-利用項目&挖掘思路 SSTI(Server Side Template Injection) 服務器模板注入, 服務端接收了用戶的輸入,將其作為 Web 應用模板內容的一部分,在進行目標編譯渲染的過程中&…

李沐動手學深度學習Pytorch-v2筆記【07自動求導代碼實現】

文章目錄前言自動求導實現非標量變量的反向傳播分離計算Python控制流的梯度計算前言 關于走動求導的理論知識個人有點難以理解,推薦大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138這篇文章,講的很好。 自動求導實現 impor…

strchr 與 strstr 函數詳解

一.strchr - 字符查找函數1.函數原型char *strchr(const char *str, int c);2.核心功能在字符串中查找特定字符的第一次出現位置3.參數說明參數 類型 說明str const char* 要搜索的字符串c int 要查找的字符(自動轉換為char)4.返回值…

jakes信道模型

Jakes 模型 前面我們介紹了多徑信道合成信號可表示為: r(t)Re{∑i0N(t)?1ai(t)u(t?τi(t))ej2πfc(t?τi(t))?Di(t)} r(t)Re \left\{\sum_{i0}^{N(t)-1}a_{i}(t)u(t-\tau_{i}(t))e^{j2\pi f_{c}(t-\tau_{i}(t))\phi_{D_{i}}(t)} \right\} r(t)…

JVM類加載機制解析

什么是類加載器? 類加載器是JVM的核心組件之一,負責將Java字節碼文件(.class文件)加載到JVM內存中。由于JVM只能執行二進制字節碼,類加載器的作用就是將編譯后的.class文件轉換為JVM可以理解和執行的格式,使…

用Python和OpenCV從零搭建一個完整的雙目視覺系統(二)

本系列文章旨在系統性地闡述如何利用 Python 與 OpenCV 庫,從零開始構建一個完整的雙目立體視覺系統。 本項目github地址:https://github.com/present-cjn/stereo-vision-python.git 項目架構設計:藍圖、分工與工作流 在上一篇文章中&#…

億級流量下的緩存架構設計:Redis+Caffeine多級緩存實戰

億級流量下的緩存架構設計:RedisCaffeine多級緩存實戰 一、為什么需要多級緩存? 在億級流量場景下,單純依賴Redis會遇到三大瓶頸:網絡延遲:Redis遠程訪問通常需要1-5ms,QPS超過10萬時成為瓶頸資源成本&…

AI基建還能投多久?高盛:2-3年不是問題,回報窗口才剛開啟

高盛表示,盡管AI商業化變現仍處早期階段,但基于成本削減的第一階段回報已經顯現。預測到2030年AI自動化可為財富500強企業節省約9350億美元成本。分析師認為,這一早期收益足以支撐當前AI基礎設施投資水平,盡管增長率可能放緩。雖然…

【mac】快捷鍵使用指南

在Mac上,根據選擇對象的不同,在選擇時移動的方法也有所不同,以下是具體介紹: 移動文件或文件夾:可通過拖放操作移動。打開“訪達”(Finder),找到要移動的文件或文件夾,按…

CS144 lab2 tcp_receiver

1. 實驗目的 lab2 的目的是實現tcp的接收端。 主要包括兩方面 (1) 從發送端接收消息,使用Reassembler聚合字節流(Bytestream) (2)將確認號(ackno)和window size發回對端 …