普集网站开发/谷歌搜索引擎优化seo

普集网站开发,谷歌搜索引擎优化seo,湖南省网站备案,太原市网站建设网站目录 介绍安装安装kibana安装ES客户端使用 介绍 Elasticsearch, 简称 ES,它是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,res…

目录

  • 介绍
  • 安装
  • 安装kibana
  • 安装ES客户端
  • 使用

介绍

Elasticsearch, 简称 ES,它是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负载等。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。es 也使用 Java 开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
Elasticsearch 是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在 Elasticsearch 中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。

安装

1.添加仓库密钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
2.添加镜像源仓库
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elasticsearch.list
3.更新软件包列表
sudo apt update
4.安装es
sudo apt-get install elasticsearch=7.17.21
5.安装ik分词器插件
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.21
6.启动es
sudo systemctl start elasticsearch
6.5如果启动es失败
调整 ES 虚拟内存,虚拟内存默认最大映射数为 65530,无法满足 ES 系统要求,需要调整为 262144 以上
sysctl -w vm.max_map_count=262144
增加虚拟机内存配置
vim /etc/elasticsearch/jvm.options
新增如下内容:
-Xms512m
-Xmx512m
在这里插入图片描述

设置完后重启ubuntu
7.查看es服务的状态
sudo systemctl status elasticsearch.service
在这里插入图片描述
8.验证es是否安装成功
curl -X GET "http://localhost:9200/"
在这里插入图片描述
9.设置能够外部访问: 如果新配置完成默认只能在本机进行访问
vim /etc/elasticsearch/elasticsearch.yml
新增配置

network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]

在这里插入图片描述
重启后sudo systemctl restart elasticsearch.service
浏览器访问http://自己的IP:9200/
在这里插入图片描述

安装kibana

kibana可以支持通过网页对ES进行访问(增删查改), 这可以让我们的测试更加直观一些
1.安装kibana
sudo apt install kibana
2.配置kibana
sudo vim /etc/kibana/kibana.yml
在7行修改为server.host: "0.0.0.0"
在这里插入图片描述

在32行修改为elasticsearch.hosts: ["http://0.0.0.0:9200"]
在这里插入图片描述
3.启动kibana服务
sudo systemctl start kibana
4.验证安装
sudo systemctl status kibana
5.访问kibana
在浏览器访问kibana, http://你的ip:5601
在这里插入图片描述

安装ES客户端

1.克隆代码
git clone https://github.com/seznam/elasticlient
注意: 这里不能从github下载源码然后拖拽进来, 因为内部有git子模块, 需要去更新子模块之后, 才能去编译
如果无法始终clone不下来, 也有对应的解决方案:https://blog.csdn.net/eyuyanniniu/article/details/145807381
2.切换目录
cd elasticlient
3.安装 MicroHTTPD 库
sudo apt-get install libmicrohttpd-dev
4.更新子模块
git submodule update --init --recursive
5.编译安装代码
mkdir build
cd build
cmake ..
make
make install

6.配置环境变量
因为我们的库默认安装路径是/usr/local/lib, 编译器可能找不到这个库目录的位置
所以我们需要配置(这些文件最好都进行配置):
全局设置: /etc/profile 当前用户设置: .bash_profil或.bashrc
在文件末尾加上 export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

使用

封装icsearch.hpp文件

#include <elasticlient/client.h>
#include <cpr/cpr.h>
#include <json/json.h>
#include <iostream>
#include <memory>
#include "logger.hpp"//ES的二次封装, 原因: 为了简化ES的使用操作, 我们可以看到, 请求的时候, 正文很长, 我们希望只设置我们关心的参数即可, 而且能自动的构造完成
//封装四个操作: 索引创建, 数据新增, 数据查询, 数据删除namespace wufan_im{
bool UnSerialize(const std::string& src, Json::Value& val)
{// 同样的Read类, 需要先构造出工厂类Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;bool ret = cr->parse(src.c_str(), src.c_str() + src.size(), &val, &err);if (ret == false) {std::cout << "json反序列化失败: " << err << std::endl;return false;}return true;
}bool Serialize(const Json::Value& val, std::string& dst)
{// Writer(StreamWriter)类, 这个类就是用来序列化的, 但是这个类不能直接构造, 因为使用了工厂模式// 先定义Json::SreamWriter 工厂类 Json::StreamWriterBuilderJson::StreamWriterBuilder swb;  //构造出工厂类std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());// 通过Json::StreamWriter中的write接口进行序列化std::stringstream ss;int ret = sw->write(val, &ss);  //将其序列化到字符流里面if (ret != 0) {std::cout << "Json反序列化失败!\n";return false;}dst = ss.str();return true;
}// 索引创建:
// 传两个参数, 索引名称 和 索引类型 就可以创建出索引
// 能够添加字段, 并设置字段类型, 设置分词器类型, 是否构造索引
class ESIndex{public:ESIndex(std::shared_ptr<elasticlient::Client>& client, const std::string& name, const std::string& type = "_doc"):_name(name), _type(type), _client(client){Json::Value analysis;   //可以把Value当做Json里的{ }Json::Value analyzer;Json::Value ik;Json::Value tokenizer;tokenizer["tokenizer"] = "ik_max_word";ik["ik"] = tokenizer;analyzer["analyzer"] = ik;analysis["analysis"] = analyzer;_index["settings"] = analysis;}// 创建索引, 就相当于在设置表结构 - ai说的// 添加字段, 就相当于设置表的字段属性ESIndex& append(const std::string& key, const std::string& type = "text", const std::string& analyzer = "ik_max_word", bool enabled = true) {Json::Value fields;fields["type"] = type;fields["analyzer"] = analyzer;if (enabled == false) fields["enabled"] = enabled;_properties[key] = fields;return *this;}bool create(const std::string& index_id = "default_index_id") {Json::Value mappings;mappings["dynamic"] = true;mappings["properties"] = _properties;_index["mappings"] = mappings;std::string body;bool ret = Serialize(_index, body);if (ret == false) {LOG_ERROR("索引序列化失败! ");return false;}LOG_DEBUG("{}", body);// 2. 发起搜索请求try{    //因为请求失败就可能会抛异常, 异常你不接住, 程序就会崩溃auto rsp = _client->index(_name, _type, index_id, body);if (rsp.status_code < 200 || rsp.status_code >= 300) {LOG_ERROR("创建ES索引 {} 失败, 响应状态码异常: {}", _name, rsp.status_code);return false;}} catch(std::exception& e) {LOG_ERROR("创建ES索引 {} 失败: {}", _name, e.what());return false;}return true;}private:std::string _name;std::string _type;Json::Value _properties;Json::Value _index;std::shared_ptr<elasticlient::Client> _client;
};// 数据新增
class ESInsert{public:ESInsert(std::shared_ptr<elasticlient::Client>& client, const std::string& name,const std::string& type = "_doc"):_name(name), _type(type), _client(client){}ESInsert& append(const std::string& key, const std::string& val){_item[key] = val;return *this;}// 插入到哪个id里面 -  这个ID就相当于是每一次插入时数据的唯一标识bool insert(const std::string id = ""){std::string body;bool ret = Serialize(_item, body);if (ret == false) {LOG_ERROR("索引序列化失败! ");return false;}LOG_DEBUG("{}", body);// 2. 发起搜索请求try{    //因为请求失败就可能会抛异常, 异常你不接住, 程序就会崩溃auto rsp = _client->index(_name, _type, id, body);if (rsp.status_code < 200 || rsp.status_code >= 300) {LOG_ERROR("新增数据 {} 失败, 响应状态码异常: {}", body, rsp.status_code);return false;}} catch(std::exception& e) {LOG_ERROR("新增数据 {} 失败: {}", body, e.what());return false;}return true;}private:std::string _name;std::string _type;Json::Value _item;std::shared_ptr<elasticlient::Client> _client;
};// 数据删除
class ESRemove{public:ESRemove(std::shared_ptr<elasticlient::Client>& client, const std::string& name, const std::string& type):_name(name), _type(type), _client(client){}bool remove(const std::string& id) {try{    //因为请求失败就可能会抛异常, 异常你不接住, 程序就会崩溃auto rsp = _client->remove(_name, _type, id);if (rsp.status_code < 200 || rsp.status_code >= 300) {LOG_ERROR("删除数据 {} 失败, 响应状态码异常: {}", id, rsp.status_code);return false;}} catch(std::exception& e) {LOG_ERROR("删除数据 {} 失败: {}", id, e.what());return false;}return true;}private:std::string _name;std::string _type;std::shared_ptr<elasticlient::Client> _client;
};//数据查询
class ESSearch{public: //用户还会设置过滤条件,以及应该包含的字段ESSearch(std::shared_ptr<elasticlient::Client>& client, const std::string& name, const std::string& type = "_doc"):_name(name), _type(type), _client(client){}ESSearch& append_must_not_terms(const std::string& key, const std::vector<std::string>& vals){Json::Value fields;for (const auto& val : vals) {fields[key].append(val);}Json::Value terms;terms["terms"] = fields;_must_not.append(terms);return *this;}ESSearch& append_should_match(const std::string& key, const std::string& val) {Json::Value field;field[key] = val;Json::Value match;match["match"] = field;_should.append(match);return *this;}Json::Value search() {Json::Value cond;if (_must_not.empty() == false) cond["must_not"] = _must_not;if (_should.empty() == false) cond["should"] = _should;Json::Value query;query["bool"] = cond;Json::Value root;root["query"] = query;std::string body;bool ret = Serialize(root, body);if (ret == false) {LOG_ERROR("索引序列化失败! ");return Json::Value();}LOG_DEBUG("{}", body);// 2. 发起搜索请求cpr::Response rsp;try{    //因为请求失败就可能会抛异常, 异常你不接住, 程序就会崩溃rsp = _client->search(_name, _type, body);if (rsp.status_code < 200 || rsp.status_code >= 300) {LOG_ERROR("检索数据 {} 失败, 响应状态码异常: {}", body, rsp.status_code);return Json::Value();}} catch(std::exception& e) {LOG_ERROR("检索数据 {} 失败: {}", body, e.what());return Json::Value();}//3. 需要对响应正文进行反序列化LOG_DEBUG("检索响应正文: [{}]", rsp.text);Json::Value json_res;ret = UnSerialize(rsp.text, json_res);if (ret == false) {LOG_ERROR("检索数据 {} 结果反序列化失败", rsp.text);return Json::Value();}return json_res["hits"]["hits"];}private:std::string _name;std::string _type;//用户还会设置过滤条件,以及应该包含的字段Json::Value _must_not;  //必须不包含的Json::Value _should;    //必须包含的, 多选一即可std::shared_ptr<elasticlient::Client> _client;
};
}

main.cc文件

#include "../../common/icsearch.hpp"
#include <gflags/gflags.h>DEFINE_bool(run_mode, false, "程序的运行模式, false-调试; true-发布;");
DEFINE_string(log_file, "", "发布模式下, 用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下, 用于指定日志输出等级");int main(int argc, char* argv[])
{google::ParseCommandLineFlags(&argc, &argv, true);wufan_im::init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);std::shared_ptr<elasticlient::Client> client(new elasticlient::Client({"http://127.0.0.1:9200/"}));bool ret = wufan_im::ESIndex(client, "test_user")// 创建索引, 就相当于在设置表结构 - ai说的// 添加字段, 就相当于设置表的字段属性.append("nickname").append("phone", "keyword", "standard", true) //手机号是不能进行分词的, 是一个关键字, 分词器用标准分词器, 需要构造索引.create();if (ret == false) {LOG_INFO("索引创建失败!");return -1;}LOG_INFO("索引创建成功");// 新增数据ret = wufan_im::ESInsert(client, "test_user").append("nickname", "张三").append("phone", "155666777").insert("00001");   // 这个ID就相当于是每一次插入时数据的唯一标识if (ret == false) {LOG_ERROR("数据插入失败!");return -1;}// 数据的修改ret = wufan_im::ESInsert(client, "test_user").append("nickname", "张三").append("phone", "1334444555").insert("00001");if (ret == false) {LOG_ERROR("数据更新失败!");return -1;}LOG_INFO("数据新增成功");Json::Value user = wufan_im::ESSearch(client, "test_user").append_should_match("phone.keyword", "1334444555")     //检索的时候, 告诉ES, 这个关键词不要进行分词// .append_must_not_terms("nickname.keyword", {"张三"}).search();if (user.empty() || user.isArray() == false) {LOG_ERROR("结果为空, 或者结果不是数组类型");return -1;}LOG_INFO("数据检索成功");int sz = user.size();LOG_DEBUG("检索结果条目数量: {}", sz);for (int i = 0; i < sz; ++i) {LOG_INFO("nickname: {}", user[i]["_source"]["nickname"].asString());}ret = wufan_im::ESRemove(client, "test_user", "_doc").remove("00001");if (ret == false) {LOG_ERROR("删除数据失败");return -1;}LOG_INFO("数据删除成功");return 0;
}

运行程序:
在这里插入图片描述

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

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

相关文章

SSL VXN

SSL VPN是采用SSL&#xff08;Security Socket Layer&#xff09;/TLS&#xff08;Transport Layer Security&#xff09;协议来实现远程接入的一种轻量级VPN技术,其基于B/S架构&#xff0c;免于安装客户端&#xff0c;相较与IPSEC有更高的灵活度和管理性&#xff0c;当隧道建立…

通义万相2.1开源版本地化部署攻略,生成视频再填利器

2025 年 2 月 25 日晚上 11&#xff1a;00 通义万相 2.1 开源发布&#xff0c;前两周太忙没空搞它&#xff0c;这个周末&#xff0c;也来本地化部署一个&#xff0c;体验生成效果如何&#xff0c;总的来说&#xff0c;它在国内文生视频、图生视频的行列处于领先位置&#xff0c…

Linux——system V共享内存

共享内存区是最快的IPC(进程内通信)形式&#xff0c;不再通过执行进入内核的系统调用来传递彼此的数据 1.共享内存的原理 IPC通信的本质是让不同的进程先看到同一份资源&#xff0c;然后再进行通信&#xff0c;所以想要通过共享内存进行通信&#xff0c;那么第一步一定是让两个…

01 SQl注入基础步骤(数字、字符、布尔盲注、报错)

目录 1、SQL注入漏洞的概要 2、SQL注入的常规思路 3、数字型注入 4、字符型注入 5、布尔盲注 6、报错注入 1、SQL注入漏洞的概要 原理&#xff1a;通过用户输入的数据未严格过滤&#xff0c;将恶意SQL语句拼接到原始查询中&#xff0c;从而操控数据库执行非预期操作。 …

在本地部署DeepSeek等大模型时,需警惕的潜在安全风险

在本地部署DeepSeek等大模型时&#xff0c;尽管数据存储在本地环境&#xff08;而非云端&#xff09;&#xff0c;但仍需警惕以下潜在安全风险&#xff1a; 1. 模型与数据存储风险 未加密的存储介质&#xff1a;若训练数据、模型权重或日志以明文形式存储&#xff0c;可能被物…

【javaEE】多线程(进阶)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一&#xff1a;海量数据的分布式计算 场景二&#xff1a;实时决策的毫秒级响应 场景三&#xff1a;弹性扩展与容错机制 技术隐喻&#xff1a; 二、车载信息系统&#xff08;IVI&#xff09;的交互 场景一&#xff1a;Android Automo…

Vue开发中计算属性与方法调用之间的区别与联系

文章目录 一 概述二 核心区别三 联系四 使用原则 一 概述 在 Vue 中&#xff0c;计算属性&#xff08;computed&#xff09; 和 方法&#xff08;methods&#xff09; 都可以用于处理数据逻辑&#xff0c;但它们的核心区别在于 缓存机制 和 触发方式 。 计算属性示例&#xf…

【Unity】 HTFramework框架(六十一)Project窗口文件夹锁定器

更新日期&#xff1a;2025年3月7日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Project窗口文件夹锁定器框架文件夹锁定自定义文件夹锁定限制条件 Project窗口文件夹锁定器 在Project窗口中&#xff0c;文件夹锁定器能够为任何文件夹加…

【软件工程】一篇入门UML建模图(状态图、活动图、构件图、部署图)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;软件开发必练内功_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

基于编译器特性浅析C++程序性能优化

最近在恶补计算机基础知识&#xff0c;学到CSAPP第五章的内容&#xff0c;在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言&#xff0c;程序的性能可以用CPE&#xff08;Cycles Per Element&#xff09;来衡量&#xff0c;其指的是处理每个元素…

transformer模型介绍——大语言模型 LLMBook 学习(二)

1. transformer模型 1.1 注意力机制 **注意力机制&#xff08;Attention Mechanism&#xff09;**在人工智能中的应用&#xff0c;实际上是对人类认知系统中的注意力机制的一种模拟。它主要模仿了人类在处理信息时的选择性注意&#xff08;Selective Attention&#xff09;&a…

Dify 本地部署教程

目录 一、下载安装包 二、修改配置 三、启动容器 四、访问 Dify 五、总结 本篇文章主要记录 Dify 本地部署过程,有问题欢迎交流~ 一、下载安装包 从 Github 仓库下载最新稳定版软件包,点击下载~,当然也可以克隆仓库或者从仓库里直接下载zip源码包。 目前最新版本是V…

2.1 掌握XML基础知识

本文介绍了结构化、半结构化和非结构化数据的概念与特点。结构化数据以固定格式存储于数据库&#xff0c;便于查询与管理&#xff0c;常用于金融等领域。半结构化数据如XML、JSON&#xff0c;具有一定的组织形式但模式不固定&#xff0c;适用于Web内容和日志文件。非结构化数据…

Android Studio 配置国内镜像源

Android Studio版本号&#xff1a;2022.1.1 Patch 2 1、配置gradle国内镜像&#xff0c;用腾讯云 镜像源地址&#xff1a;https\://mirrors.cloud.tencent.com/gradle 2、配置Android SDK国内镜像 地址&#xff1a;Index of /AndroidSDK/

超过 37000 台 VMwareESXi 服务器可能受到持续攻击威胁

近日&#xff0c;威胁监测平台影子服务器基金会&#xff08;The Shadowserver Foundation&#xff09;发布报告&#xff0c;指出超 3.7 万个互联网暴露的威睿&#xff08;VMware&#xff09;ESXi 实例存在严重安全隐患&#xff0c;极易受到 CVE-2025-22224 漏洞的攻击。该漏洞属…

npm终端执行时报错

终端npm执行时报错下错误&#xff1a; 报错了&#xff0c;就来百度&#xff0c;报错的原因是 1、这个错误是因为 PowerShell 的执行策略&#xff08;Execution Policy&#xff09;限制了脚本的运行 2、默认情况下&#xff0c;Windows 系统可能会禁止运行未签名的脚本&#x…

JVM类加载器面试题及原理

JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码文件加载到JVM中&#xff0c;从而让Java程序能够启动起来。 1. 类加载器的种类 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;加载JAVA_HOME/jre/lib目录下的库扩展类加载器&#xff…

C语言每日一练——day_3(快速上手C语言)

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第三天。&#xff08;会连续更新&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…

用Qt手搓AI助手,挑战24小时开发DeepSeek Assistant!

一、项目需求分析与技术选型 DeepSeekAssistant是一款基于深度求索&#xff08;DeepSeek&#xff09;API的智能对话助手&#xff0c;核心需求包括&#xff1a; 用户界面友好&#xff1a;支持多轮对话展示数据持久化&#xff1a;历史记录存储与检索异步网络通信&#xff1a;AP…