倒排索引C++实现

倒排索引原理:根据属性的值来查找记录位置。

假设有3篇文章,file1, file2, file3,文件内容如下:

file1 (单词1,单词2,单词3,单词4....)

file2 (单词a,单词b,单词c,单词d....)

file3 (单词1,单词a,单词3,单词d....)

那么建立的倒排索引就是这个样子:

单词1 (file1,file3)

单词2 (file1)

单词3 (file1,file3)

单词a (file2, file3)

...

下面是我对于倒排索引的一个简单的实现。该程序实现了某目录下的文件单词统计,并建立了倒排索引。

头文件:inverted_index.h

#define MAXLINE 1024

class InvertedIndex
{
public:
	InvertedIndex(){}
	~InvertedIndex(){result_index_.clear();}

	int StatWords(const char* file_name);
	map<string,map<string,int> > result_index(){return result_index_;}

private:
	//存放倒排索引结果,key是单词,value也是map,该map的key是文件名,value是该单词在该文件中出现的次数
	map<string,map<string,int> > result_index_;

	int ParseWordsByLine(char* str_line, const char* file_name);
	void InsertWordToMap(char* word, const char* file_name);
};

实现文件:inverted_index.cpp

int InvertedIndex::StatWords(const char* file_name)
{
	FILE *fp;
    if((fp = fopen(file_name,"r")) == NULL)
    {
        printf("cannot open %s", file_name);
        return -1;
    }

    char str_line[MAXLINE];
	while(fgets(str_line, MAXLINE, fp) != NULL)
	{
		int len = strlen(str_line);
		str_line[len-1] = '\0';  /*去掉换行符*/
		ParseWordsByLine(str_line,file_name);
	}
    fclose(fp);
    return 0;
}

int InvertedIndex::ParseWordsByLine(char* str_line, const char* file_name)
{
	if(strlen(str_line) == 0)
	{
		return -1;
	}

	const char* needle=" \n\t";
	/*strtok在s中查找包含在delim中的字符并用NULL(‘\0’)来替换,直到找遍整个字符串。
	返回值:从s开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。*/
	char* word = strtok(str_line, needle);
	while(word != NULL)
	{
		InsertWordToMap(word,file_name);
	    word = strtok(NULL, needle);
	}
	return 0;
}

void InvertedIndex::InsertWordToMap(char* word, const char* file_name)
{
	if(strlen(word) == 0)
	{
		return;
	}
	string word_str = word;
	string file_name_str = file_name;

	map<string,map<string,int> >::iterator it;
	it = result_index_.find(word_str);

	if(it == result_index_.end())//not found
	{
		map<string,int> file_word_count;
		file_word_count.insert(pair<string,int>(file_name_str,1));
		result_index_[word_str] = file_word_count;
	}
	else
	{
		map<string,int> file_word_count = result_index_[word_str];
		file_word_count[file_name_str] ++ ;
		result_index_[word_str] = file_word_count;
	}
}

运行结果:

全部源代码:https://github.com/zhihaibang/benson-style/tree/master/C%2B%2B/inverted_index

时间: 2024-12-22 20:05:41

倒排索引C++实现的相关文章

【搜索引擎(二)】索引、倒排索引、哈希表、跳表

索引 其实在计算机中我们早已接触过跟索引有关的东西,比如数据库里的索引(index),还有硬盘文件系统中其实也有类似的东西,简而言之,索引是一种为了方便找到自己需要的东西而设计出来的条目,你可以通过找索引找到自己想要内容的位置.索引过程是: 关键字->索引->文档.在图书馆内的书分门别类,就是一种按类别来分的索引.当然索引还有很多其他的实现. 仅仅有索引的概念是不够的.虽然分门别类是一种方法,但是我们在拥有一堆文档的时候必须要有从文档到索引的规范过程,并且索引的结构要满足能够让人(或者计算机)

MapReduce编程(七) 倒排索引构建

一.倒排索引简介 倒排索引(英语:Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射.它是文档检索系统中最常用的数据结构. 以英文为例,下面是要被索引的文本: T0="it is what it is" T1="what is it" T2="it is a banana" 我们就能得到下面的反向文件索引: "a": {

搜索引擎倒排索引表压缩:gamma编码

当你每天打开电脑,在百度搜索框中输入你要搜索的内容,按下回车之后,你可能不会意识到,有无数台主机在飞速运转,对比了数百万条记录,经过初步结果集生成.相关度打分.结果排序.摘要生成之后,才最终在你的屏幕上打出了你想要的结果.这一切仅仅发生在几毫秒之间. 是什么保证了如此迅速的检索速度呢?良好的索引构建是其中的要素之一.通常情况下,搜索引擎内部会为每个网页或文章分配一个数字id,用这个id代表这个网页或者文章.构建索引的时候,采用分词工具将这些网页或者文章分成一个个词,并网页id存储在称为倒排索引表

solr中文搜索倒排索引和数据存储结构

作为搜索,我们传统的方式(正排索引)是从关键点出发,然后再通过关键点找到关键点代表的信息中能够满足搜索条件的特定信息,既通过KEY寻找VALUE.而Lucene的搜索则是采用了倒排索引的方式,即通过VALUE找KEY.而在中文全文搜索中VALUE就是我们要搜索的单词,存放所有单词的地方叫词典.KEY是文档标号列表(通过文档标号列表我们可以找到出现过要搜索单词VALUE的文档).正排索引从文档编号找词: 倒排索引是从词找文档编号: 当文档数据来临时,solr会首先对文档数据进行分词,创建索引库和文

Hadoop学习笔记(8) ——实战 做个倒排索引

Hadoop学习笔记(8) ——实战 做个倒排索引 倒排索引是文档检索系统中最常用数据结构.根据单词反过来查在文档中出现的频率,而不是根据文档来,所以称倒排索引(Inverted Index).结构如下: 这张索引表中, 每个单词都对应着一系列的出现该单词的文档,权表示该单词在该文档中出现的次数.现在我们假定输入的是以下的文件清单: T1 : hello world hello china T2 : hello hadoop T3 : bye world bye hadoop bye bye 输

Lucene4.6 把时间信息写入倒排索引的Offset偏移量中,并实现按时间位置查询

有个新的技术需求,需要对Lucene4.x的源码进行扩展,把如下的有时间位置的文本写入倒排索引,为此,我扩展了一个TimeTokenizer分词器,在这个分词器里将时间信息写入 偏移量Offset中.扩展了一个Filter,最后查询时通过filter把时间信息传进去过滤想要的时间范围之内的结果. Lucene倒排索引中分好的词有两个偏移量一个是按字符的偏移量(BeginOffset和EndOffset)另一个是以分词(Term)为一个单元的position,每增加一个词position加1,如果

MapReduce实现倒排索引

倒排索引 倒排索引"是文档检索系统中最常用的数据结构,被广泛地应用于全文搜索引擎.它主要是用来存储某个单词(或词组)在一个文档或一组文档中的存储位置的映射,即提供了一种根据内容来查找文档的方式.由于不是根据文档来确定文档所包含的内容,而是进行相反的操作,因而称为倒排索引(Inverted Index). file1: MapReduce is simple file2: MapReduce is powerful is simple file3: Hello MapReduce bye MapR

Hadoop之倒排索引

前言: 从IT跨度到DT,如今的数据每天都在海量的增长.面对如此巨大的数据,如何能让搜索引擎更好的工作呢?本文作为Hadoop系列的第二篇,将介绍分布式情况下搜索引擎的基础实现,即“倒排索引”. 1.问题描述 将所有不同文件里面的关键词进行存储,并实现快速检索.下面假设有3个文件的数据如下: file1.txt:MapReduce is simple file2.txt:mapReduce is powerful is simple file3.txt:Hello MapReduce bye M

Java查找算法(三): 倒排索引

[ 什么是倒排索引 ]  索引:就好比是书的目录,通过目录我们可以快速的找到对应的章节. 倒排索引源于实际应用中需要根据属性的值来查找记录,例如:通过文章中的单词找到对应的文章. [ 倒排索引例子 ]  假设有三篇文章,内容分别为: 文章1: it is what it is 文章2:what is it 文章3:it is a banana 我们可以得到如下的倒排索引表: 关键字 所在文章 a {2} banana {2} is {0, 1, 2} it {0, 1, 2} what {0,

MapReduce实战--倒排索引

本文地址:http://www.cnblogs.com/archimedes/p/mapreduce-inverted-index.html,转载请注明源地址. 1.倒排索引简介 倒排索引(Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射.它是文档检索系统中最常用的数据结构. 有两种不同的反向索引形式: 一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表. 一个单词的