Go语言中文网 为您找到相关结果 34

用GO语言实现一个简单的搜索引擎

用GO语言实现一个简单的搜索引擎 项目地址是:https://github.com/wyh267/FalconEngine 对搜索引擎感兴趣的可以去看看这本书,比较浅并且也比较完整的介绍了一个搜索引擎的全部机能。 我的这个搜索引擎原始数据是MySql数据库的,大家可以根据需要进行二次开发,用来支持其他数据库或者本地文件,Detail文件是存储在Redis数据库中,同样这部分也可以根据自己的需要二次开发,使用本地文件或者其他数据库,倒排索引和正排索引本地存储的时候使用的json格式,比较耗磁盘,第一版暂时这样了吧,后续再做优化。 使用方法 依赖以下几个库 github.com/outmana/log4jzl log文件 github.com/ewangplay/config 配置文件解析 gi...阅读全文

博文 2015-07-28 00:00:00 ygrx

阿里云专家为你解读安全管家服务

课程介绍 阿里云安全管家服务是阿里云安全专家基于阿里云多年安全最佳实践经验为云上用户提供的全方位安全技术和咨询服务,为云上用户建立和持续优化云安全防御体系,保障用户业务安全。 阿里云应急响应服务能够在您的系统遭受黑客攻击时提供快速、专业的应急处理,包括入侵行为排查、病毒木马查杀、入侵原因分析、入侵影响评估等;能够帮助客户正确应对黑客攻击,降低攻击带来的安全损失。 产品详情:https://www.aliyun.com/product/sos/ 课时列表 • 课时1:安全管家服务规格介绍 • 课时2:基础巡检功能介绍 • 课时3:如何使用应急响应服务 开始学习http://click.aliyun.com/m/27864/ ...阅读全文

golang实现快排

// QuickSort package main import ( "fmt" "math/rand" "time" ) func swap(a int, b int) (int, int) { return b, a } func partition(aris []int, begin int, end int) int { pvalue := aris[begin] i := begin j := begin + 1 for j < end { if aris[j] < pvalue { i++ aris[i], aris[j] = swap(aris[i], aris[j]) } j++ } aris[i], aris[begin] = swap(aris[i], aris[begi...阅读全文

博文 2016-08-04 10:00:00 datakv

golang 进程出现too many open files的排查过程

1. 现象 服务的cpu跑满(golang实现), 并大量报too many open files错误.服务使用systemd来运行,部署在阿里ecs上. 2.分析 从日志来看,cpu的上升主要为到达文件数限制引起的,但之前已经更改过系统的文件数及所有用户的文件数,按道理是不应该出现这个问题的,后来查阅资料发现,文件数可以从三个维度限制分别为操作系统限制,用户态限制,以及进程限制,对于这三个维度选取最小值生效.于是对系统进行分析. 首先查看当前打开文件数, 进程占用的文件数并不多. lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more 然后获取系统级文件数限制 输入命令cat /etc/sysctl.conf得到fs.file-max = 1...阅读全文

博文 2016-10-11 09:00:11 u010511236

日志搜索平台Poseidon

波塞冬,是希腊神话中的海神,在这里是寓意着海量数据的主宰者。 Poseidon 系统是一个日志搜索平台,可以在数百万亿条、数百PB大小的日志数据中快速分析和检索特定字符串。 360公司是一个安全公司,在追踪 APT(高级持续威胁)事件时,经常需要在海量的历史日志数据中检索某些信息, 例如某个恶意样本在某个时间段内的活动情况。在 Poseidon 系统出现之前,都是写 Map/Reduce 计算任务在 Hadoop 集群中做计算, 一次任务所需的计算时间从数小时到数天不等,大大制约了 APT 事件的追踪效率。 Poseidon 系统就是为了解决这个需求,能在几秒钟内从数百万亿条规模的数据集中找出我们需要的数据,大大提高工作效率; 同时,这些数据不需要额外存储,仍然存放在Hadoop集群中,节...阅读全文

开源项目 2017-02-07 03:16:54 Qihoo360

今日头条推荐系统架构设计实践

互联网时代内容分发的变革​今日头条本质上是一个强大的智能推荐引擎​数据截止于:截至2016年12月底头条DAU : 7800w ;头条MAU : 1.75亿;单用户日平均使用时长: 76分钟;用户行为峰值: 150w+ msg/s;每天训练数据: 300T+ (压缩后) ;机器规模:万级;系统架构​面临挑战期望快速反馈: 10min内;feature数量: 200+;存量用户数和每天的用户行为数据量巨大;在线存储:读写吞吐高,要求延时低且可预期;流式计算实现Storm Python框架写MR的方式写Streaming Job ;Topology用Yaml描述,代码自动生成,降低编写job成本;框架自带KafkaSpout ,业务仅关注拼接和计算逻辑;Batch MR相关算法逻辑可以直接复用在...阅读全文

博文 2019-07-25 14:05:33 wyygxly

go语言:WaitGourp使用

在学习go语言时,用到了“sync”包中的WaitGourp结构,来达到控制任务的完成。 由于WaitGroup是结构,所有需要通过sync.WaitGroup{}来创建 很类似与 Shoper/JAVA并发库之倒记时锁存器CountDownLatch中的CountDownLatch类。 Add(),Done(),Wait()。其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。 package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) waitGourp := syn...阅读全文

博文 2014-10-31 08:00:00 x369201170

用Golang写一个搜索引擎(0x01)--- 基本概念

从零开始,写一个搜索引擎 (0x01) 第零部分我们已经列了一个提纲了,这一篇文章开始要详细说说了。 搜索引擎基本概念 在说搜索引擎架构分层之前,我们先确定几个搜索引擎的概念。 文档,搜索引擎的基本数据单元,比如一张网页,一个商品,多个文档合在一起就是一个搜索引擎的完整数据 倒排索引,正排索引,存储在搜索引擎内部的数据结构,也是搜索引擎最底层的数据结构。 索引器,将文档数据生成可供搜索的倒排索引和正排索引的程序就是索引器。 检索器,通过对倒排索引和正排索引进行查找,从而查找到文档的程序。 字段,每个文档可能有多个字段,比如一篇文章有标题,作者,摘要,详情,发布时间的,这些东西虽然在一个文档中,但是搜索的时候需要区别对待。 索引,多个文档通过索引器生成了一堆倒排正排索引,我们把这些倒排正排索引...阅读全文

博文 2016-07-27 10:54:23 吴yh坚

用Golang写一个搜索引擎(0x02)--- 倒排索引技术

这一篇,我们来说说搜索引擎最核心的技术,倒排索引技术,倒排索引可能需要分成几篇文章才说得完,我们先会说说倒排索引的技术原理,然后会讲讲怎么用一些数据结构和算法来实现一个倒排索引,然后会说一个索引器怎么通过文档来生成一个倒排索引。 倒排索引 什么是倒排索引呢?索引我们都知道,就是为了能更快的找到文档的数据结构,比如给文档编个号,那么通过这个号就可以很快的找到某一篇文档,而倒排索引不是根据文档编号,而是通过文档中的某些个词而找到文档的索引结构。 倒排索引技术简单,高效,简直是为搜索引擎这种东西量身定做的,就是靠这个技术,实现一个搜索引擎才成为可能,我们也才能在海量的文章中通过一个关键词找到我们想要的内容。 我们看个例子,有下面的几个文档: 文档编号 文档内容 1 这是一个Go语言实现的搜索引擎 ...阅读全文

博文 2016-07-20 11:10:55 吴yh坚

用Golang写一个搜索引擎(0x05)--- 文本相关性排序

上面我们已经说过了一些倒排索引的东西,并且也知道了如何来实现一个倒排索引完成检索功能,那么检索完了以后如何排序呢,这一篇简单的说一下倒排索引的文本相关性排序,因为排序实在是太复杂了,我们这里就说说文本的相关性排序,而且是最简单的TD-IDF排序,之后有机会可以再说说整个搜索的排序算法有些什么。 文本相关性排序 首先明白几个概念: Term,分词以后最小的单位,比如用Golang写一个搜索引擎,分词以后就是用,golang,写,一个,搜索引擎,那么每一个词就是一个Term。 TF(Term Frequency),Term在文章中出现的频率,就是当前term在文章中出现的频率,就是term次数/总term数,比如上文中的搜索引擎这个term的TF就是1/5,TF越高那么这篇文章中的这个词就越重要...阅读全文

博文 2017-02-09 08:18:07 吴yh坚

用Golang写一个搜索引擎 (0x00)--- 从零开始

很早就想写一系列的这样的文章了,之前在一个电商公司做搜索,对搜索引擎有一些认识,来到一个新的创业公司以后非常高兴还有机会继续做这方面的事情,虽然领域已经变了,而且不是做搜索了,但是技术还是那些技术,并且有机会接触到了Go语言,对于一个将近10年C/C++的程序员来说,Go的一些特质让我觉得非常舒服,可参见我之前的这篇文章。 从公司项目衍生出了一个自己的搜索引擎项目,然后有了这篇文章。 先聊聊目标吧,我希望实现一个这样的搜索引擎 使用Go语言实现,方便部署,最好就用一个二进制文件搞定一些,不需要安装任何依赖。 类似一个电商的搜索引擎,支持多字段的检索,不仅仅是文本的全文索引,还需要包括过滤功能(比如价格区间过滤),汇总功能(比如结果集中品牌数量汇总),基本的统计功能。 索引器和搜索器在一起,主...阅读全文

博文 2016-07-11 13:50:21 吴yh坚

用Golang写一个搜索引擎(0x07)--- 正排索引

最近各种技术盛会太多,朋友圈各种刷屏,有厂商发的各种广告,有讲师发的各种自拍,各种参会的朋友们各种自拍,好不热闹,不知道你的朋友圈是不是也是这样啊,去年还没这么多技术会议,今年感觉爆发了,呵呵,真是一个互联网技术的好时代,而且还有各种撕B可看,真想八一八,怕得罪人,我们这种码农还是专注技术专注写代码吧。 你有什么想了解的也可以给我留言哈,欢迎交流,我的工作之前主要做的是搜索的,也做推荐和广告,这部分的东西可能写得多点,对了,嵌入式领域也行(跨得有点大,这个嵌入式不是iOS和Android,是真的嵌入式),没什么高端背景,也不是BAT这种大厂的,就是一小公司写代码的,所以有很多东西还是不懂,你要是和我交流了发现我答不上来很正常啊,人艰不拆啊。。 本篇也比较长,但是干货不多,建议上厕所的时候看,...阅读全文

博文 2017-02-09 08:18:15 吴yh坚

我的第一个GO程序

不说了,直接上图好! 这里要为GO的设计者点个赞,咱之前使用C语言构建一个工程的时候,除了要设计好工程的目录结构外,还要写一个繁琐的Makefile文件,Go语言倒好了,根本不用什么Makefile文件,连.h文件也都省了,反正编译器都这么智能了,还需要我们特意为声明而写一个.h文件吗。 而使用LiteIDE添加工程的时候也好简单,直接添加这个工程目录即可,哈哈简单得不能再简单了...阅读全文

博文 2015-09-23 09:00:01 -渐行渐远

饿了么:分布式时序数据库 - LinDB

饿了么对时序数据库的需求主要来自各监控系统,主要用于存储监控指标。原来使用graphite,后来慢慢有对指标有多维的需求(主要体现在对一个指标加多个Tag, 来组成Series,然后对Tag进行Filter和Group进行计算),这时graphite基本很难满足需求。 业界现在用的比较多的主要有如下几类TSDB: 免费获取学习Java高架构、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取 架构群:863621962 InfluxDB:很多公司都在用,包括饿了么有部分监控系统也是用InfluxDB。优点,支持多维和多字段,存储也根据TSDB的特点做了优化。但...阅读全文

博文 2018-09-19 20:21:12 Java1324

go语言:Eclipse与LiteIDE之间路径问题

今天做文件操作的时候,发现了一个路径问题. 当我在使用相对路径进行文件操作时(之前项目是用Eclipse写的),使用"./"得到的路径是基于GoPath的当前路径. 当我今天换成LiteIDE的时候,项目报错了.提示找不到文件,很纳闷找了半天,排查了半天发现,LiteIDE使用"./"是获取当前运行程序所在的当前路径. 与Eclipse环境恰恰相反...阅读全文

博文 2015-06-17 23:07:43 x369201170

用Golang写一个搜索引擎(0x0B)--- 第一部分结束

这一篇算给这一个系列告一个小的段落,之前开始写这些文章的时候,只是想把自己最近用Golang写的这个搜索引擎说一说,准备了大概3,4篇的量,但是一写下来,发现有点收不住,写到后面其实和Golang没什么关系了,主要在写搜索引擎的架构和一些数据结构了,我觉得这比写代码注释有用吧,而且通过这样写下来,我自己对这些个数据结构的理解也更深了。 一个月的时间,写了14篇了,虽然14篇文字不足以说明一个搜索引擎的实现,但我觉得基本上一些重要的东西我都说了,搜索引擎本身原理上其实比较简单,并且我们并没有涉及搜索引擎爬虫的部分,所以说起来并不是很复杂,复杂是复杂在外围一些算法上的东西,比如分词,比如排序之类的。 来看看我们都说了些啥 开了个头以后,先说了一下搜索引擎的基本概念,包括docid的概念,以及整个...阅读全文

博文 2017-02-09 08:21:00 吴yh坚

海量数据处理常用方法有哪些?

处理海量数据是大数据工程师必备技能,通过对PB级别的数据进行挖掘与分析发掘出有价值的信息,为企业或政府做出正确决策提供依据,是十分必要的一项工作,以下是常用的海量数据处理方法! **1. Bloom filter** Bloom filter是一种二进制向量数据结构,具有很好的空间效率和时间效率,可用来检测一个元素是否属于一个集合。该方法的优点是它的插入和查询时间都是常数,并且它查询元素却不保存元素本身,因此,具有良好的安全性,但因其算法的原因,其正确率稍低,可以确定不存在数据一定不存在,确定存在的数据不一定存在,适合对低错误率可以容忍的场合。 **2. Hash** Hash即散列函数,其是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数,根据处理需求的不同,...阅读全文

用Golang写一个搜索引擎 (0x04) --- B+树

本篇较长较枯燥,请保持耐心看完。 前面两章介绍了一下倒排索引以及倒排索引字典的两种存储结构,分别是跳跃表和哈希表,本篇我们介绍另一种数据结构,他也被大量使用在信息检索领域,我在github上实现的搜索引擎的词典也是用的这个数据结构,它就是B+树。 首先,我们看看什么是树,树是程序设计中一个非常基础的数据结构,记得大学时候的数据结构课,链表,栈,队列,然后就是树了,虽然那时候想必大家都被前序遍历,中序遍历,后序遍历折腾过,不过树确实是一种非常有用的数据结构。 上一篇我们说过,表2的第一列首要解决的问题就是能快速找到对应的词,然后找到对应词的倒排列表,除了跳跃表和哈希表,B+树也能满足条件,B+树是B树的变种,我们B树我们就不看了,感兴趣的大家可以直接去google一下,我们主要讲的是B+树,下...阅读全文

博文 2017-02-09 08:18:01 吴yh坚

记录golang初始化mysql连接失败问题

package mysql import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) var ( db *sql.DB err error ) func init() { db, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/database?charset=utf8") if err != nil { panic(err.Error()) } db.SetMaxOpenConns(1000) err = db.Ping() if err != nil { fmt.Println("Failed to connect to mysql, err:" ...阅读全文

博文 2019-03-31 18:34:38 莫夏_b560

golang 服务大量 CLOSE_WAIT 故障排查

事故经过 排查 总结 事故经过 【2019-12-27 18:00 周五】业务方突然找来说调用我们程序大量提示“触发限流”,但是我们没有收到任何监控报警。紧急查看了下 ServiceMesh sidecar 代理监控发现流量持续在减少,但是监控中没有任何触发限流的 http code 429 占比,如果有触发限流我们会收到报警。 后来通过排查是程序中有一个历史限流逻辑触发了,但是程序中触发限流返回的 http code 是 200,这就完全避开了 sidecar http code 非200 异常指标监控报警。把代码中的限流阈值调了非常大的一个值,统一走 sidecar 限流为准。 猜测本次触发限流可能跟网路抖动有关系,网络抖动导致连接持续被占用,最终 qps 超过限流阈值。因为这个程序最近...阅读全文

博文 2020-01-26 23:33:41 王清培

用Golang写一个搜索引擎(0x06)--- 索引构建

不知不觉写到第七篇了,按这个节奏,估计得写到15到20篇左右才能写完,希望自己能坚持下去,之前写代码的时候很多东西并没有想得那么细致,现在每写一篇文章还要查一些资料,确保文章的准确性,也相当于自己复习了一下吧,呵呵。 先说一下,关于倒排文件,其实还有很多东西没有讲,到后面再统一补充一下吧,主要是倒排文件的压缩技术,这一部分因为目前的存储空间不管是硬盘还是内存都是很大的,所以压缩技术用得不是很多了。 今天我们来讲讲倒排索引的构建。 之前,我们了解到了,倒排索引在系统中是存成下图这个样子 上面的B+树是一个文件,下面的倒排链是一个文件,那么,如何来构建这两个文件呢,本章我会说说一般的常规构建方法,然后说一下我是怎么构建的。 一般情况下,搜索引擎默认会认为索引是不会有太大的变化的,所以把索引分为全...阅读全文

博文 2017-02-09 08:18:10 吴yh坚

求一个竞价倒计时技术实现方案

需求如下: 1. 一个竞价场次同时支持多个竞价条目,针对单个竞价条目进行报价 2. 一个竞价场次有总倒计时,每个竞价条目单独计算倒计时,竞价场次开始时所有倒计时数字一致 3. 用户针对单个竞价条目发起报价时,如果当前竞价条目倒计时时间 < N 时,会自动顺延 N 秒,同时总倒计时顺延 N 秒 4. 单个竞价条目倒计时结束后,最后报价者即中标,所有竞价调剂倒计时都结束后,同时竞价场次结...阅读全文

用Golang写一个搜索引擎(0x08)--- 索引的段

我觉得这个标题应该改改了,我写下来其实是告诉大家怎么写一个搜索引擎,并没有涉及太多的Golang的东西,我觉得这样也挺好,熟悉了原理,用什么实现其实并不重要了,而且说说原理比说代码更实在。 之前已经说了底层的数据结构了,包括倒排和正排索引。今天我们上一层,来说说索引的字段和段。 字段这个上一篇已经介绍过了,字段的概念实际上是搜索引擎索引中我们能看到的最底层的东西,也是对外暴露的最底层的概念,在字段之下是倒排和正排索引,这两项其实对用户是封装起来了,我们可以认为每个字段对应一个正排和一个倒排,而实际上也确实是这样的。 在字段之上就是我们这一篇主要说的段了,段这个概念并不是搜索引擎特有的,也不是必须的,是我这个项目新增出来的,当然,也不是我原创,很多搜索引擎的引擎系统都有这个概念。 所谓段,就是...阅读全文

博文 2017-02-09 08:19:58 吴yh坚

leetcode_1331

Golang: 思路:这题需要对数组进行排序,然后将数组内的元素的实际排位存进map里,然后对数组进行依次赋值 代码如下: func arrayRankTransform(arr []int) []int { if len(arr)==0{ return []int{} } if len(arr)==1 { return []int{1} } arr2:=make([]int,len(arr)) copy(arr2,arr) sort.Ints(arr2) mp:=make(map[int]int) temp:=1 for i:=1;i阅读全文

博文 2020-03-08 17:32:43 淳属虚构

golang 全排列 leetcode dfs

func _permutation(arr []int) [][]int{ var results = make([][]int,0) var used = make([]int, len(arr)) helper(&results,arr,make([]int,0), used) return results } func helper(results *[][]int ,arr, tmparr, used []int) *[][]int { if len(tmparr) == len(arr) { *results = append(*results, tmparr) } else { for i:=0;i阅读全文

博文 2019-12-29 19:32:39 adsfasdf_

MapReduce:在大型集群上简化数据处理(1)

特别说明 这是一个由simviso团队所组织进行的基于mit分布式系统课程翻译的系列,由知秋带领和其他成员一起翻译的课程以及课程当中涉及的论文翻译。本文章参与人员 参与人员 参与范围 知秋 审校 虚生花 翻译 概要 MapReduce是一种编程模型,它是一种用于处理和生成大型数据集的实现。用户通过指定一个用来处理键值对(Key/Value)的map函数来生成一个中间键值对集合。然后,再指定一个reduce函数, 它用来合并所有的具有相同中间key的中间value 。现实生活中有许多任务可以通过该模型进行表达,具体案例会在论文中展现出来。 以这种函数式风格编写的程序能够在一个大型商用机器集群上自动并行执行。这个系统在运行时只关心:如何分割输入数据,在大量计算机所组成的集群上的调度问题,集群中计...阅读全文

博文 2020-03-06 10:32:48 知秋o

golang 快速排序

golang 快速排序 package main import ( "fmt" "strconv" ) func quickSort(arr []int, low, high int) { if low < high { var pivot = partition(arr, low, high) quickSort(arr, low, pivot) quickSort(arr, pivot + 1, high) } } func partition(arr []int,low,high int) int { var pivot = arr[low] var i = low var j= high // 6 5 4 3 2 1 // 6 1 2 3 4 7 for i< j{ for arr[...阅读全文

博文 2020-03-03 22:33:49 moakia

golang程序问题处理经验

1.在做内存问题相关的 profiling 时: 若 gc 相关函数占用异常,可重点排查对象数量 解决速度问题(CPU占用)时,关注对象数量( --inuse/alloc_objects )指标 解决内存占用问题时,关注分配空间( --inuse/alloc_space )指标 inuse 代表当前时刻的内存情况,alloc 代表从从程序启动到当前时刻累计的内存情况,一般情况下看 inuse 指标更重要一些,但某些时候两张图对比着看也能有些意外发现。 2.在日常 golang 编码时: 参数类型要检查,尤其是 sql 参数要检查(低级错误) 传递struct尽量使用指针,减少复制和内存占用消耗(尤其对于赋值给interface,会分配到堆上,额外增加gc消耗) 尽量不使用循环引用,除非逻辑真...阅读全文

博文 2019-08-03 22:32:39 凯文不上班

Influxdb中基于磁盘的倒排索引文件TSI结构解析

TSI文件结构概览 一个TSI文件的定义和操作在 tsdb/index/tsi1/index_file.go里实现的 一个TSI文件的结尾存储了这个文件相关的meta信息,主要是其他section在文件中的offset和size,这个meta信息被称为tsi文件的IndexFileTrailer,我们看一下它的Size的定义: IndexFileTrailerSize = IndexFileVersionSize + 8 + 8 + // measurement block offset + size 8 + 8 + // series id set offset + size 8 + 8 + // tombstone series id set offset + size 8 + 8 + ...阅读全文

博文 2018-12-23 11:34:44 扫帚的影子