Nodejs 第八十四章(ElasticSearch搜索)

news2024/9/23 13:21:42

在这里插入图片描述

ElasticSearch基本用法在之前的篇章介绍过了 这里不在过多阐述

模拟假数据

  1. 安装库 @faker-js/faker 模拟假数据的一个库非常好用支持中文
  2. 使用中文 locale: [zh_CN], 设置即可
  3. 生成名字,邮箱,手机号,id,年龄,性别
  4. 生成完成之后使用fs写入data.json文件
import { Faker, zh_CN, } from '@faker-js/faker'
const faker = new Faker({
    locale: [zh_CN],
})
const generate = (total = 100) => {
    let arr = []
    for (let i = 0; i < total; i++) {
        arr.push({
            name: faker.person.fullName(),
            email: faker.internet.email(),
            phone: faker.string.numeric({ length: 11 }),
            id: faker.string.uuid(),
            age: faker.number.int({ min: 18, max: 60 }),
            isMale: faker.datatype.boolean(),
        })
    }
    return arr
}

fs.writeFileSync('./data.json', JSON.stringify(generate(), null, 2))

假数据

 [{
    "name": "隐强",
    "email": "k7nggq88@126.com",
    "phone": "79533230542",
    "id": "945e80bb-9ece-428b-925c-1ed01e26d660",
    "age": 44,
    "isMale": true
  },
   ......]

Node.js集成ElasticSearch

  1. fs读取刚才写入的文件
  2. 安装ElasticSearch的包@elastic/elasticsearc
  3. 连接elastic 两种模式可以使用apiKey,也可以用账号密码的模式,这儿使用账号密码,生产使用apiKey
  4. 检查有没有创建过这个索引如果重复创建会报错
  5. 如果没有创建过这个索引就创建,并且构建映射表 也就是字段 properties
  6. 批量插入数据封装一个函数 bulkInsert
  7. 实现插入的函数 bulkInsert
  8. 搜索
//1.第一步
const data = fs.readFileSync('./data.json', 'utf-8')
const arr = JSON.parse(data)
//2.第二步
import { Client } from '@elastic/elasticsearch';
//3.第三步
const client = new Client({
    node: 'http://localhost:9200',
    auth: {
        username: 'elastic',
        password: '123456',
    },
});
//4.第四步
const exists = await client.indices.exists({ index: 'users' });
//5.第五步
if (!exists) {
    await client.indices.create({
        index: 'users',
        mappings: {
            properties: {
                name: { type: 'text', fields: { keyword: { type: 'keyword', } } },
                email: { type: 'text' },
                phone: { type: 'text' },
                id: { type: 'text' },
                age: { type: 'integer' },
                isMale: { type: 'boolean' },
            }
        }
    })
    //6.第六步
    await bulkInsert(arr);
}
//7.第七步
const bulkInsert = async (data) => {
    const operations = [];
    data.forEach((item) => {
        operations.push({
            index: {
                _index: 'users',
                _id: item.id
            },
        })
        operations.push(item)
    })
    //批量插入
    await client.bulk({ refresh: true, operations })
}
//8.搜索
const response = await client.search({
    index: 'users',
    query: {
        match_all: {},
    },
    size: 100
});
console.log(response.hits.hits);

搜索详解

根据上面代码 + 讲解基本已经大概了解其工作原理,ElasticSearch最强大的就是他的搜索能力,可以各种组合搜索,我们分别演示一下

1.全部查询

match_all 就是全部查询 注意默认只返回10条,你可以配置size看你想要返回的条数

const response = await client.search({
    index: 'users',
    query: {
        match_all: {}, //空对象即可
    },
    size: 100 //返回100条
});

2.模糊查询

模糊查询会进行分词,匹配所有的关键词

使用match进行模糊查询,输入需要匹配的字段如name 后面是 value 如 隐强 他会匹配数据中所有包含 隐强 这两个字的内容 我的数据中含有 隐强 蒋强 高启强 因此返回三条

const response = await client.search({
    index: 'users',
    query: {
        match: {
            name: '隐强'
        },
    },
    size: 100
});
console.log(response.hits.hits);

3.精确查询

如果需要支持精准查询 需要设置 name: { type: 'text', fields: { keyword: { type: 'keyword', } } }, 因为text类型默认会支持分词,为了全文搜索设计,但是如果要同时支持 全文匹配 + 精准匹配 需要设置 type keyword

注意这儿就不使用match了,改成term [字段.keyword] = [value] 查询

const response = await client.search({
    index: 'users',
    query: {
        term: {
            'name.keyword': '隐强'
        }
    },
    size: 100
});
console.log(response.hits.hits);

4.组合查询
  1. must 必须匹配的条件 这儿匹配了(隐强)
  2. filter 条件过滤 这儿匹配了年龄(20-60岁的人)
  3. must_not 必须不匹配 (这儿表示返回的值不能有带国字的人)
  4. should 可选的条件 (这儿匹配了隐强)
const response = await client.search({
    index: 'users',
    query: {
       bool:{
          must: {
             match: {
                name: '隐强'
             }
          },
          filter: {
             range: {
                age: {
                   gte: 20,
                   lte: 60
                }
             }
          },
          must_not: {
             match: {
                name: '国'
             }
          },
          should: {
             match: {
                name: '隐强'
             }
          }
       }
    },
    size: 100
});
console.log(response.hits.hits);

5.聚合查询

聚合查询在Elasticsearch中用来对数据进行统计、汇总和分析,它能够提供关于数据集的深入见解和洞察

案例 统计各个年龄出现的次数 注意使用 aggs 不再是 query

const response = await client.search({
    index: 'users',
    aggs: {
        age: {
            terms: {
                field: 'age'
            }
        }
    },
    size: 100
});
console.log(response.aggregations.age.buckets);

返回值

key:表示聚合的字段值,这里看起来是年龄。

doc_count:表示具有该年龄的文档数量。

[
  { key: 32, doc_count: 6 }, //表示年龄32 出现6次
  { key: 23, doc_count: 4 }, //表示年龄23 出现4次
  { key: 28, doc_count: 4 }, //.......
  { key: 29, doc_count: 4 },
  { key: 49, doc_count: 4 },
  { key: 51, doc_count: 4 },
  { key: 60, doc_count: 4 },
  { key: 21, doc_count: 3 },
  { key: 22, doc_count: 3 },
  { key: 24, doc_count: 3 }
]

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

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

相关文章

【自然语言处理】面向新冠肺炎的社会计算应用

面向新冠肺炎的社会计算应用 1 任务目标 1.1 案例简介 新冠肺炎疫情牵动着我们每一个人的心&#xff0c;在这个案例中&#xff0c;我们将尝试用社会计算的方法对疫情相关的新闻和谣言进行分析&#xff0c;助力疫情信息研究。本次作业为开放性作业&#xff0c;我们提供了疫情…

软件安装下载失败,常见问题汇总(微软软件必备运行库)

文章目录 前言一、卸载软件二、激活软件无法打开&#xff1f;三、安装软件必备运用库扩展&#xff1a;win64位操作系统跟win32位操作系统区别之处 前言 我们在安装激活一些常用的办公软件&#xff0c;如&#xff1a;visio、Matlab、office等等&#xff0c;经常会遇到各种问题&…

Feature Alignment and Uniformity for Test Time Adaptation--论文笔记

论文笔记 资料 1.代码地址 https://github.com/SakurajimaMaiii/TSD 2.论文地址 https://arxiv.org/abs/2303.10902 3.数据集地址 论文摘要的翻译 TTA在接收训练分布外的测试域样本时对深度神经网络进行自适应。在这样设置下&#xff0c;模型只能访问在线未标记的测试样…

在conda的环境中安装Jupyter及其他软件包

Pytorch版本、安装和检验 大多数软件包都是随Anaconda安装的&#xff0c;也可以根据需要手动安装一些其他软件包。 目录 创建虚拟环境 进入虚拟环境 安装Jupyter notebook 安装matplotlib 安装 pandas 创建虚拟环境 基于conda包的环境创建、激活、管理与删除http://t.cs…

云计算【第一阶段(29)】远程访问及控制

一、ssh远程管理 1.1、ssh (secureshell)协议 是一种安全通道协议对通信数据进行了加密处理&#xff0c;用于远程管理功能SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;建立在应用层和传输层基础上的安全协议。SSH客…

2个月拿下TOGAF证书的一点心得分享,干货很多!

人物背景介绍&#xff1a; 从报名TOGAF考试到拿证&#xff0c;只用了两个月不到的时间。 考试成绩&#xff1a;TOGAF L1L2通过&#xff0c;L1获得87分&#xff0c;L2 获得70分。 引言&#xff1a; TOGAF证书作为国际架构标准&#xff0c;不仅包括了架构顶点思维&#xff0c…

SpringBoot注解--11--@JSONField @JsonProperty

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一个问题&#xff1a;后端实体类isXXX开头的属性&#xff0c;传到前端后自动去掉is解决方法&#xff1a; JsonProperty和JSONField1.简介2.注解的区别2.1 底层框架不…

使用pip或conda离线下载安装包,使用pip或conda安装离线安装包

使用pip或conda离线下载安装包&#xff0c;使用pip或conda安装离线安装包 一、使用pip离线下载安装包1. 在有网络的机器上下载包和依赖2. 传输离线安装包 二、在目标机器上离线安装pip包三、使用conda离线下载安装包1. 在有网络的机器上下载conda包2. 传输conda包或环境包3. 在…

基于QT开发的反射内存小工具

前言 最近项目需要需要开发一个反射内存小工具&#xff0c;经过2天的修修改终于完成了。界面如下&#xff1a; 功能简介 反射内存指定地址数据读取反射内存指定地址数据写入反射内存指定地址数据清理十进制、十六进制、二进制数据相互转换 部分代码 void RfmMain::setWOthe…

十七、计算机视觉-图像平滑处理

提示&#xff1a;云峰 文章目录 前言一、均值滤波&#xff08;Mean Filtering&#xff09;二、高斯滤波器&#xff08;Gaussian Filter&#xff09;&#xff1a;三、中值滤波器&#xff08;Median Filter&#xff09; 前言 在本节中&#xff0c;我们将探讨图像处理中的平滑处理…

短视频矩阵管理系统:如何提升内容质量,帮助企业获客?

在数字化营销蓬勃发展的今天&#xff0c;短视频已成为企业推广的重要阵地。然而&#xff0c;如何高效管理短视频内容&#xff0c;提升内容质量&#xff0c;进而帮助企业精准获客&#xff0c;成为企业亟待解决的问题。短视频矩阵管理系统应运而生&#xff0c;以其强大的功能和灵…

uniapp:使用mescroll实现左导航,右数据(数据带分页)

<template><view class"u-wrap"><u-navbar title"复购" :is-back"false" :border-bottom"false" title-color"#282828"></u-navbar><view class"u-menu-wrap"><scroll-view scr…

Visual Studio下安装引入Boost库

背景&#xff1a; 在 Win 上通过 Visual Studio 运行 c 代码&#xff0c;引入头文件 #include <boost/...>&#xff0c;显式无法打开&#xff0c;需要手动下载boost并进行配置。 1、下载boost Boost官网&#xff1a;Boost Downloads 下载boost&#xff0c;解压&#xf…

2024年高职物联网实验室建设及物联网实训平台整体解决方案

随着物联网技术的蓬勃发展&#xff0c;其在各行业的应用日益广泛&#xff0c;对具备物联网专业技能的高素质人才需求也急剧增加。为了满足这一市场需求&#xff0c;高职院校作为技能型人才培养的重要阵地&#xff0c;亟需加强物联网专业的建设。本文旨在提出《2024年高职物联网…

STM32基础篇:EXTI × 事件 × EXTI标准库

EXTI EXTI简介 EXTI&#xff1a;译作外部中断/事件控制器&#xff0c;STM32的众多片上外设之一&#xff0c;能够检测外部输入信号的边沿变化并由此产生中断。 例如&#xff0c;在检测按键时&#xff0c;按键按下时会使电平产生翻转&#xff0c;因此可以使用EXTI来读取按下时…

ChatGPT摆脱“AI味”:全面提升写作质感

ChatGPT在各种写作、创作场景都发挥了很大的价值&#xff0c;即使中文语料库占比不到5%&#xff0c;也能生成流畅的中文文本。但随着使用的深入&#xff0c;大家也逐渐发现了机器生成的内容&#xff0c;往往带有一种僵硬、刻板的“AI味”&#xff0c;尤其在论文、自媒体写作中&…

[RK3308H_Linux] 关于8+2(8路模拟麦克风 + 2路es7243e回采)的调试心得

问题描述 RK3308H 使用8路个模拟麦克风录音&#xff0c;2路用es7243e做回采 解决方案&#xff1a; 首先先调8路模拟麦克风&#xff0c;根据原理图确定使用的是哪路I2S。 以下为dts配置&#xff0c;acodec的属性注释附上。 &acodec {status "okay";rockchip,m…

CCNA-2-V7-模块7–9:可用且可靠的网络考试答案

1.一台启用了DHCP的客户端PC刚刚启动。客户端PC在与DHCP服务器通信时,将在哪两个步骤中使用广播消息?(选两个。) DHCPDISCOVERDHCPACKDHCPOFFERDHCPREQUESTDHCPNAK 2.管理员发出命令:管理员想达到什么目的? Router(config)# interface g0/1 Router(config-if)# ip address …

智充科技营收增速放缓:经营成本飙升,应收账款大幅增长

《港湾商业观察》黄懿 6月10日&#xff0c; XCHG Limited 智能充电有限公司(下称&#xff1a;智充科技)在美国证监会(SEC)更新招股书&#xff0c;拟在美国纳斯达克上市&#xff0c;其股票代码为“XCH”。北京智充科技有限公司为其国内运营主体&#xff08;下称“北京智充科技”…

深入理解Java集合框架:构建高效、灵活的数据管理方案

深入理解Java集合框架&#xff1a;构建高效、灵活的数据管理方案 引言 Java集合框架&#xff08;Java Collections Framework, JCF&#xff09;是Java语言提供的一套用于表示和操作集合的统一架构。它包含了一系列的接口和类&#xff0c;用于存储和操作对象集合&#xff0c;如…