node.js分词搜索

news2024/12/28 4:10:42

背景 

最近有个需求是要实现类似【搜索引擎】的功能,用户输入关键字,后台实时推送相关数据。

思路

先仿Elasticsearch做一个简单的分词效果,然后根据分词逐一数据库查询,然后以结果【出现次数由多到少】的顺序展示数据。

实现 

第一步,做一个分词工具,区分中文英文数字,并排除特殊字符和空格(以你们实际需求修改即可),代码如下,相应注释都在其中,可直接使用

@/utils/index.js

/**
 * 搜索输入分词处理
 * @param info 用户输入的字符串
 * @returns {*|*[]|*[]|null}
 */
function infoDeal (info) {
  let list = []

  // 初步判断是否输入字符
  if (info === null | info === undefined) {
    return undefined
  } else if (info.trim() === '') {
    return list
  } else {
    let infos = info
    let list2 = []
    let list3 = []

    // 英文大写转小写,获得新字符串
    infos = infos.toLowerCase()

    // 清除空格,并依据空格分割为数组
    list2 = infos.split(' ')
    // 清除字符之间存在多个空格的情况
    list2.forEach(item => {
      if (item !== '') {
        list3.push(item)
      }
    })

    // 正则判断,区分中文、英文数字,并排除特殊字符
    let isEnglish = new RegExp('[A-Za-z]+')
    let isInt = new RegExp('[0-9]+')
    let isSpecialChar = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>《》/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]")

    // 利用正则分词,中文直接push添加到数组,英文数字整一串push进数组,特殊字符直接舍弃
    list3.forEach(item => {
      let isEng = false // 判断是否开始记录英文数字
      let Eng = '' // 记录英文数字组合
      for (let i = 0; i < item.length; i++) {
        // 判断是否是英文数字
        if (isEnglish.test(item[i]) | isInt.test(item[i])) {
          // 判断是否开始记录了这一串英文数字组合
          if (!isEng) {
            Eng = item[i]
            isEng = true
          } else {
            Eng = Eng + item[i]
          }

          // 判断是否是最后一个字符
          if (i === item.length - 1) {
            list.push(Eng)
          }
        } else if (isSpecialChar.test(item[i])) {
          // 判断是否是特殊字符
          if (Eng) {
            list.push(Eng)
            Eng = ''
            isEng = false
          }
        } else {
          if (Eng) {
            list.push(Eng)
            Eng = ''
            isEng = false
          }
          list.push(item[i])
        }
      }
    })
    return list
  }
}

module.exports = {
  infoDeal
}

效果如下: 

 

let info = "【市场价2532】HUAWEI WATCH 2 Pro 4G智能手表 移动支付"

// 分词结果:市|场|价|2532|huawei|watch|2|pro|4g|智|能|手|表|移|动|支|付

 第二步、在数据库中更具分词数组,逐一搜索,并根据结果出现次数排序

// infoList就是前面分词返回的数组,这是在判断数组不为空的前提下执行的方法
function SearchCsgoskin (conn, res, infoList) {
  let list = [] // 返回结果列表
  let sql = ''
  // 循环添加搜索语句
  infoList.forEach((item, index) => {
    sql = sql + 'SELECT name from csgoskin WHERE name like "%' + item + '%";'
  })
  conn.query(sql, (err, result, fields) => {
    if (err) {
      console.log(err)
      res.end(JSON.stringify({
        code: 301,
        msg: '检索意外错误',
        data: err
      }))
    } else {
      if (result.length > 1) {
        let allresult = []
        let numresult = {}
        // 将全部结果合并为一个数组
        for (let i = 0; i < result.length; i++) {
          allresult = allresult.concat(result[i])
        }

        // 记录出现次数
        allresult.forEach(item => {
          if (numresult[item.name] === undefined) {
            numresult[item.name] = 1
          } else {
            numresult[item.name] = numresult[item.name] + 1
          }
        })

        // 根据出现次数进行排序(纯数组)
        let sortList = Object.keys(numresult).sort((a, b) => {
          return numresult[b] - numresult[a]
        })

        // 为了适应提示框,将结果变成【对象数组】
        sortList.forEach(item => {
          let obj = {}
          obj['name'] = item
          list.push(obj)
        })
      } else {
        list = result
      }
      res.end(JSON.stringify({
        code: 200,
        msg: '检索成功',
        data: list
      }))
    }
  })
}

效果图: 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/716644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++多线程学习(三、线程处理函数【get_id、sleep_for、yield、sleep_until】)

目录 线程处理函数 1.获取线程id&#xff1a;get_id 2.延时函数&#xff1a;sleep_for 3.放弃执行函数&#xff0c;调用另一个线程&#xff1a;yield 4.让当前线程休眠直到指定的时间点&#xff1a;sleep_until 线程处理函数 1.获取线程id&#xff1a;get_id #include&l…

C#基础笔记

1.1、数据类型 值类型 需得到一个类型或一个变量在特定平台上的准确尺寸&#xff0c;可以使用 sizeof 方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。 using System;namespace DataTypeApplication {class Program{static void Main(string[] args){…

简单而高效的文件管理系统

随着数字化时代的不断发展&#xff0c;人们在日常生活和工作中处理的文件越来越多。如何有效地管理这些文件成为了一个亟待解决的问题。基于云的文件管理系统可以帮助用户更快地查找、组织和共享文件&#xff0c;提高工作效率。本文将介绍如何打造简单而高效的文件管理系统。 …

netty学习(2):多个客户端与服务器通信

1. 基于前面一节netty学习&#xff08;1&#xff09;:1个客户端与服务器通信 只需要把服务器的handler改造一下即可&#xff0c;通过ChannelGroup 找到所有的客户端channel&#xff0c;发送消息即可。 package server;import io.netty.channel.*; import io.netty.channel.gr…

群晖GitLab修改clone(克隆)地址

通过群晖的Docker(ContainerManager)配置好GitLab后&#xff0c;每次clone代码总要修改前面的地址&#xff0c;因此作者找到了修改的办法&#xff0c;实属不易&#xff0c;请给个关注&#xff01; 给出我的群晖配置gitlab的设置&#xff0c;如图1。 图1 Docker中GitLab的配置 按…

生成式AI筑建基石,亚马逊云科技以强大应用能力和辐射范围加快技术传播速度

众所周知&#xff0c;要把大模型转化为生产力&#xff0c;AI模型、算力和数据会是难以逾越的门槛。新的目标已经出现&#xff0c;我们是否有了足够强大的AI基础设施&#xff1f;在6月28日上海举行的峰会上&#xff0c;亚马逊云科技展示了这样的能力。 从掀起AI画图热潮的Stabil…

禁用USB接口的几个办法

本文为大家提供了四个禁用电脑USB接口的方法&#xff0c;如果企业用户建议使用方法三&#xff0c;方法三可以批量对公司内部所有电脑的usb接口进行禁用。 方法一&#xff1a;使用设备管理器禁用USB接口 步骤1&#xff1a;打开设备管理器 首先&#xff0c;我们需要打开设备管理…

玩转smardaten | 速来围观CSDN万粉博主如何零代码开发学生管理系统?

编者荐语&#xff1a; “开发软件必须写代码吗&#xff1f;有没有真正不写代码的快速开发工具&#xff1f;”这是CSDN测试开发领域的万粉博主曲鸟一直思考的问题。今年5月底接触到smardaten&#xff0c;仅用3天自学配置&#xff0c;开发出一款学生管理系统。不得不说&#xff…

python自动化测试 - 自动化框架及工具

1 概述 手续的关于测试的方法论&#xff0c;都是建立在之前的文章里面提到的观点&#xff1a; 功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本文选择的测试语言是 python 脚本语言。由于其官…

CentOS8安装docker容器

一、yum包更新到最新 [rootnginx /]# sudo yum update 若是出现以下异常; 处理&#xff1a; 1.首先&#xff0c;进入到 yum 的 repos 目录 [rootnginx /]# cd /etc/yum.repos.d/2.更新一下源。修改 centos 文件内容 [rootnginx yum.repos.d]# sed -i s/mirrorlist/#mirrorlist/…

Vue2+3入门到实战

作为IT技术相关行业不可或缺的岗位之一&#xff0c;前端开发工程师就业前途广阔&#xff0c;一直是很多同学心中转行的首选行业。但很多人还没开始&#xff0c;便被一系列问题难倒了&#xff0c;比如&#xff1a;前端该如何入门&#xff1f;路线图是怎样的&#xff1f;想要找到…

网络编程—— IP地址 + 端口号 +TCP/IP协议 + 协议分层的封装与应用

文章目录 前言一、网络发展各阶段二、网络通信的三大要素1.IP地址2.端口号3.网络协议 三、TCP/IP五层网络模型各层级的用处网络设备所在分层 四、封装和分用封装分用网络传输的实际情况 总结 前言 本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各…

如何提升你的小程序开发流程:实用的建议和技巧

随着微信小程序开发的兴起&#xff0c;越来越多的人想要开发自己的微信小程序&#xff0c;那么&#xff0c;如何提升你的微信小程序开发流程呢&#xff1f; 如果你还没有自己的小程序&#xff0c;那你现在就应该开始着手准备了。如果你已经有了自己的小程序&#xff0c;那么&a…

数字游牧民,连开会都如此“高科技”

你知道“数字游民”吗&#xff1f;是指无须到点上下班&#xff0c;旅居在悠闲惬意的海岛或乡村&#xff0c;通过互联网就能完成工作的群体&#xff0c;这样的工作模式便称作“数字游牧”。听起来很像社畜们的“梦中情job”&#xff0c;是近几年来全球流行的新型生活方式。 在疫…

学生体测的人体运动检测的mediapipe技术怎么实现?

Mediapipe是一个开源的跨平台框架&#xff0c;用于构建实时多媒体处理应用程序。它提供了一系列的预训练模型和工具&#xff0c;其中包括人体姿势估计模型&#xff0c;可以用于人体运动检测。 要使用Mediapipe进行人体运动检测&#xff0c;可以按照以下步骤进行&#xff1a; …

如何在多个 Linux 服务器上运行多个命令

动动发财的小手&#xff0c;点个赞吧&#xff01; 如果你正在管理多台 Linux 服务器&#xff0c;并且你想在所有 Linux 服务器上运行多个命令&#xff0c;但你不知道该怎么做。不用担心&#xff0c;在这个简单的服务器管理指南[1]中&#xff0c;我们将向您展示如何在多个 Linux…

CSS样式表

CSS样式表 1、CSS介绍 CSS Cascading Style Sheet 层叠样式表&#xff0c;或&#xff0c;级联样式表 表现HTML文件样式的计算机语言 修饰静态页面 配置脚本语言动态对网页元素进行样式格式化 排序 对元素的位置进行像素级精确控制 支持所有字体字号样式 对网页对象和模型样式…

rsync 远程同步

目录 一、 rsync 概念1.2 rsync 同步方式 二、rsync 特性三、 rsync与cp、scp对比配置rsync源服务器发起端下行同步发起端上行同步五、 rsyncinotify5.1 修改rsync源服务器配置文件5.2 调整发起端inotify内核参数5.3 安装 inotify-tools5.4 在另外一个终端编写触发式同步脚本&a…

代码随想录day7

四数之和II 力扣 思路&#xff1a; 这道题我们可以拆分为两个部分来做&#xff0c;首先计算前两个数组元素的和并且统计这个组合出现的次数&#xff0c;然后用0减掉后两个数组。 如果发现0减去后两个数组已经出现在我们之前记录出现次数的map中了&#xff0c;那么就可以说他们…

聊一聊人工智能与视频技术的5大发展趋势与应用

随着互联网的快速发展&#xff0c;视频时代已经到来。据统计&#xff0c;目前互联网内容中&#xff0c;视频内容占据高达82%的流量&#xff0c;未来仍将持续增长。今天我们就来聊一聊关于视频技术的发展&#xff0c;以及现在的大热门–人工智能技术与视频技术的结合。 视频技术…