全文搜索是现代 Web 应用中必不可少的部分,可以让用户方便地查找自己想要的内容。本篇文章将介绍如何使用 Koa2 和 ElasticSearch 实现全文搜索,以及如何优化搜索结果,让用户得到更准确的信息。
简介
ElasticSearch 是一个开源分布式搜索引擎,可以快速地存储、搜索和分析大量数据。Koa2 是一个基于 Node.js 的 Web 框架,实现了异步流程控制和中间件机制,可以让开发者更方便地实现 Web 应用。
本文将使用 ES6 和 async/await 语法,因此需要 Node.js 7.6 以上版本。
准备工作
在开始之前,需要先安装 ElasticSearch,可以通过官方网站 https://www.elastic.co 下载并安装最新版本。
然后需要用 npm 安装 Koa2 和 ElasticSearch 客户端:
npm install koa koa-router koa-bodyparser elasticsearch --save
实现搜索功能
连接 ElasticSearch
首先需要连接 ElasticSearch,可以使用官方提供的 Node.js 客户端 elasticsearch.js,也可以使用非官方的库 elasticsearch-client(以下代码使用的是 elasticsearch-client):
const elasticsearch = require('elasticsearch'); const esClient = new elasticsearch.Client({ node: 'http://localhost:9200', log: 'error' }); module.exports = esClient;
创建 Koa2 应用
使用 Koa2 创建一个简单的 Web 应用,实现搜索功能:
-- -------------------- ---- ------- ----- --- - --------------- ----- ---------- - -------------------------- ----- ------ - -------------------- ----- --- - --- ------ ---------------------- ------------------------- --------------------------------- ---------------- -- -- - ---------------- -- ------- -- ------------------------ ---
创建路由
创建一个路由,接收客户端传递的搜索关键字,并将结果返回:
-- -------------------- ---- ------- ----- ------ - ---------------------- ----- -------- - ---------------------------------- ----- ------ - --- --------- --------------------- ----- ----- -- - ----- - - - - ---------- -- ---- - -------- - - ------ --- ------ -- ------- - ----- ------ - ----- ----------------- ------ ------------ ----- - ------ - ------------ - ------ -- ------- ------------ -------------- - - - --- -------- - ------------------------ -- ------------- ---
创建索引和文档
在使用 ElasticSearch 进行搜索之前,需要先创建索引和文档。可以在命令行中运行以下命令创建索引:
-- -------------------- ---- ------- ---- -- --- ------------------------------- -- -------------- ----------------- -- - - ----------- - ------------- - -------- - ------- ------ -- -------------- - ------- ------ -- ------ - ------- --------- - - - --
建议使用 curl 命令或 Kibana 进行索引的创建和 CRUD 操作,这里不再赘述。
创建文档的示例代码:
-- -------------------- ---- ------- ----- -------- - ---------------------------------- ----- ----------- - ----- ------ -- - ----- - ------ ------------ --- - - ----- ----- ------ - ----- ---------------- ------ ------------ ----- - ------ ------------ --- - --- ------ ----------- -- -------------- - - ----------- --
使用搜索结果
在客户端收到搜索结果之后,需要将数据展示给用户。可以使用 Vue.js 或 React 等前端框架进行页面渲染,这里提供一个简单的示例代码:
-- -------------------- ---- ------- --------- ----- ----- ---------- ------ ----- ---------------- ------------- --------------- ------- ------ ---- --------- ---- ------------------------------- ---- -------------------------------- ------------- --- ------- --- --------------- -- ----------- -- ----------------------- -------------- ------ ----- -------------------- ------ ----- ----- ------ ------- ------------------------------------------------- ------- ----------------------------- ------- -------
-- -------------------- ---- ------- ------ --- ---- ------ ----- --- - --- ----- --- ------- ----- - -------- ------ ---------- -- -- ----- --------- - ----- - - --- ------------------------------------------ -- ---- - ------- - ------------ - ----- ----- -------- - ----- ------------------------ ----- ---- - ----- ---------------- -------------- - ----- ------------ - ------ - ---
分析搜索结果
在快速实现搜索功能之后,需要对搜索结果进行分析和优化,以便提高搜索的精确度和效率。
调整搜索权重
在例子中,使用 multi_match 查询方式,将关键字同时匹配 title 和 description 字段。同时,将 title 字段的权重调整为 10,这样在匹配 title 时,会更倾向于搜索结果中包含关键字的文档。如果搜索结果不够准确,可以调整查询参数,或使用更为复杂的查询方式。
使用聚合查询
聚合查询是 ElasticSearch 中的一个高级特性,可以进行分组、计算和统计等操作。在实际应用中,用户需要的不仅是单纯的搜索结果,还需要根据分类、计数等方式对结果进行分析和展示。
以下是简单的聚合查询示例:
-- -------------------- ---- ------- ----- ------ - ----- ----------------- ------ ------------ ----- - ------ - ------------ - ------ -- ------- ------------ -------------- - -- ----- - ----- - ------ - ------ -------------- - -- --------- - ------ - ------ ---------- - -- ----- - ------ - ------ ------ - -- ------ - ------------ - ------ ------------- - - - - ---
这个查询会同时返回 tags、category、user 和 count 四个聚合结果。可以将结果展示给用户,让用户更好地了解搜索结果的分布情况。
使用分析器
分析器是 ElasticSearch 中的一个功能强大的工具,可以根据多个参数进行分词、过滤和归一化等操作。在实际应用中,用户通常会输入不同形式和大小写的关键字,通过使用分析器,可以让搜索结果更准确地匹配用户的搜索意图。
在创建索引时,可以为每个字段设定不同的分析器:
-- -------------------- ---- ------- - ----------- - ------------- - -------- - ------- ------- ----------- ----------- --------- - ----- - ------- ------- ----------- ------------- - - -- -------------- - ------- ------- ----------- --------- -- ------ - ------- --------- - - - -
在以上示例中,title 字段设置了 standard 和 ik_max_word 两种分析器,用于处理英文和中文文本。ik_max_word 是一个开源的中文分析器,可以将中文文本拆分为最大长度的词语,让搜索结果更加准确。
总结
本文介绍了如何使用 Koa2 和 ElasticSearch 实现全文搜索,并对搜索结果进行分析和优化。全文搜索是 Web 应用中的一个重要功能,通过本文的介绍,希望读者能更好地掌握搜索相关的技术和知识,更好地实现搜索功能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/659f4206add4f0e0ff7f01f2