倒排索引的简单实现

倒排索引是搜索引擎中常用的算法,主要用来实现full text searching,建立关键词和所在文档的映射关系,很多强大的功能都建立在此基础之上,关于Inverted Index的详尽描述可以看Wikipedia。下面按照自己的想法实现之,只是为了体会这个数据结构的运作。

todo:如果要搜完整的出现一句话如“what is it”可以分别搜这几个单词然后看出现在同一个文件连续位置的结果即可,集合运算。

package mythought.invertedindex;

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Map;

import java.util.Set;

public class InvertedIndex {

// key word <----> doc file

private Map<String, Set<String>> indexs = new HashMap<String, Set<String>>();

// 这里假设都是小文件

public void addFile(String fileName, String content) {

String[] words = content.split(" ");

for (int i = 0; i < words.length; i++) {

String word = words[i];

// only record first appeared position

Set<String> wordIndex = indexs.get(word);

if (wordIndex == null) {

wordIndex = new HashSet<String>();

indexs.put(word, wordIndex);

}

wordIndex.add("("+fileName + "," + i+")");

}

}

public void addFile(String fileName) throws Exception{

BufferedReader br = new BufferedReader(new FileReader(fileName));

try {

StringBuilder sb = new StringBuilder();

String line = br.readLine();

while (line != null) {

sb.append(line);

sb.append(" ");// 每行直接串接

line = br.readLine();

}

this.addFile(fileName, sb.toString());

catch(Exception e){

e.printStackTrace();

}finally {

br.close();

}

}

public Set<String> search(String keyword) {

Set<String> results = indexs.get(keyword);

return new HashSet<String>(results);

}

public static void main(String[] args) throws Exception{

InvertedIndex test = new InvertedIndex();

test.addFile("file1", "hello fuck world todotodo");

test.addFile("file2", "go to get it if you want it");

test.addFile("C:/data/hello.txt");

System.out.println(test.search("it"));

System.out.println(test.search("you"));

System.out.println(test.search("vonzhou"));

}

}

运行结果:

[(file2,7), (file2,3)]

[(file2,5)]

[(C:/data/hello.txt,4)]

参考:

1.http://en.wikipedia.org/wiki/Inverted_index

时间: 2024-10-29 15:13:03

倒排索引的简单实现的相关文章

倒排索引-搜索引擎的基石

文章转自:http://blog.csdn.net/hguisu/article/details/7969757 1.概述       在关系数据库系统里,索引是检索数据最有效率的方式,.但对于搜索引起,他它并不能满足其特殊要求: 1)海量数据:搜索引擎面对的是海量数据,像Google,百度这样大型的商业搜索引擎索引都是亿级甚至几千的网页数量 ,面对如此海量数据 ,使得数据库系统很难有效的管理. 2)数据操作简单:搜索引擎使用的数据操作简单 ,一般而言 ,只需要增. 删. 改. 查几个功能 ,而

搜索引擎之倒排索引浅析

上一篇文章 ElasticSearch 术语中提到了倒排索引,那么这篇文章就来讲解下什么是倒排索引,倒排索引的数据结构以及 ElasticSearch 中的倒排索引. 倒排索引 倒排索引(Inverted Index) 也常被称为反向索引,是搜索引擎中非常重要的数据结构,为什么说它重要呢,我们首先拿一本书<重构 改善既有代码的设计>举个例子: 如果一本书没有目录的话,理论上也是可以读的,只是合上书下次再次阅读的时候,就有些耗费时间了. 通过给一本书加目录页,可以快速了解这本书的大致内容分布以及

Elasticsearch 简介

1. 背景 Elasticsearch 在公司的使用越来越广,很多同事之前并没有接触过 Elasticsearch,所以,最近在公司准备了一次关于 Elasticsearch 的分享,整理成此文.此文面向 Elasticsearch 新手,老司机们可以撤了. 2. 倒排索引 先简单介绍下搜索引擎的基础数据结构倒排索引. 我们在平时,会经常使用各种各样的索引,如我们根据链接,可以找到链接里的具体文本,这就是索引.反过来,如果,如果我们能根据具体文本,找到文本存在的具体链接,这就是倒排索引,可简单理

24.通过ngram分词机制实现index-time搜索推荐

一.ngram和index-time搜索推荐原理 1.什么是ngram 假设有一个单词:quick,在5种长度下的ngram情况如下: ngram length=1,q u i c k ngram length=2,qu ui ic ck ngram length=3,qui uic ick ngram length=4,quic uick ngram length=5,quick 什么是edge ngram,就是首字母后进行ngram.比如quick这个单词,拆分如下: q qu qui qu

ES--04

第三十一讲! 分布式文档系统 写一致性原理以及相关参数 课程大纲 (1)consistency,one(primary shard),all(all shard),quorum(default) 我们在发送任何一个增删改操作的时候,比如说put /index/type/id,都可以带上一个consistency参数,指明我们想要的写一致性是什么?put /index/type/id?consistency=quorum one:要求我们这个写操作,只要有一个primary shard是activ

Elasticsearch深入8

搜索推荐,search as you type 百度 --> elas --> elasticsearch --> elasticsearch权威指南 GET /my_index/my_type/_search { "query": { "match_phrase_prefix": { "title": "hello d" } } } 原理跟match_phrase类似,唯一的区别,就是把最后一个term作为

倒排索引简单理解

http://blog.csdn.net/hguisu/article/details/7962350 http://blog.csdn.net/hguisu/article/details/7969757 =====================           我是分割线          ============================= 倒排索引(英语:Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一

mapreduce实现搜索引擎简单的倒排索引

使用hadoop版本为2.2.0 倒排索引简单的可以理解为全文检索某个词 例如:在a.txt 和b.txt两篇文章分别中查找统计hello这个单词出现的次数,出现次数越多,和关键词的吻合度就越高 现有a.txt内容如下: hello tom hello jerry hello kitty hello world hello tom b.txt内容如下: hello jerry hello tom hello world 在hadoop平台上编写mr代码分析统计各个单词在两个文本中出现的次数 其实

正排索引和倒排索引简单介绍

在搜索引擎中,数据被爬取后,就会建立index,方便检索. 在工作中经常会听到有人问,你这个index是正排的还是倒排的?那么什么是正排呢?什么又是倒排呢?下面是一些简单的介绍. 网页A中的内容片段: Tom is a boy. Tom is a student too. 网页B中的内容片段: Jon works at school. Tom's teacher is Jon. 正排索引: 正排索引是指文档ID为key,表中记录每个关键词出现的次数,查找时扫描表中的每个文档中字的信息,直到找到所