首先看一个例子:
假设有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)
....
倒排索引的概念很简单:就是将文件中的单词作为关键字,然后建立单词与文件的映射关系。当然,你还可以添加文件中单词出现的频数等信息。倒排索引是搜索引擎中一个很基本的概念,几乎所有的搜索引擎都会使用到倒排索引。
下面是我对于倒排索引的一个简单的实现。该程序对于输入的一段文字,查找出该词所出现的行号以及出现的次数。
import java.io.*;
import java.util.HashMap;
import java.util.Map;
public class InvertedIndex {
private Map<String, Map<Integer, Integer>> index;
private Map<Integer, Integer> subIndex;
public void createIndex(String filePath) {
index = new HashMap<String, Map<Integer, Integer>>();
try {
File file = new File(filePath);
InputStream is = new FileInputStream(file);
BufferedReader read = new BufferedReader(new InputStreamReader(is));
String temp = null;
int line = 1;
while ((temp = read.readLine()) != null) {
String[] words = temp.split(" ");
for (String word : words) {
if (!index.containsKey(word)) {
subIndex = new HashMap<Integer, Integer>();
subIndex.put(line, 1);
index.put(word, subIndex);
} else {
subIndex = index.get(word);
if (subIndex.containsKey(line)) {
int count = subIndex.get(line);
subIndex.put(line, count+1);
} else {
subIndex.put(line, 1);
}
}
}
line++;
}
read.close();
is.close();
} catch (IOException e) {
System.out.println("error in read file");
}
}
public void find(String str) {
String[] words = str.split(" ");
for (String word : words) {
StringBuilder sb = new StringBuilder();
if (index.containsKey(word)) {
sb.append("word: " + word + " in ");
Map<Integer, Integer> temp = index.get(word);
for (Map.Entry<Integer, Integer> e : temp.entrySet()) {
sb.append("line " + e.getKey() + " [" + e.getValue() + "] , ");
}
} else {
sb.append("word: " + word + " not found");
}
System.out.println(sb);
}
}
public static void main(String[] args) {
InvertedIndex index = new InvertedIndex();
index.createIndex("news.txt");
index.find("I love Shanghai today");
}
}
其中,输入文件news.txt内容为:
I am eriol
I live in Shanghai and I love Shanghai
I also love travelling
life in Shanghai
is beautiful
输出结果为:
word: I in line 1 [1] , line 2 [2] , line 3 [1] ,
word: love in line 2 [1] , line 3 [1] ,
word: Shanghai in line 2 [2] , line 4 [1] ,
word: today not found
分享到:
相关推荐
采用MFC可视化,通过建立倒排索引表,简单实现了搜索功能
程序用java编写后向算法中文分词分词,并建立倒排索引表。然后在myeclipse下编写一个web形式的搜索测试页。
大数据实验报告Hadoop编程实现InvertedIndex文档倒排索引程序附源码.doc
使用倒排索引实现的简单的搜索引擎demo 能对莎士比亚全集的文本进行搜索,并显示该词语所在的篇目和所在句子 源代码及说明也可在github获取 https://github.com/yunwei37/myClassNotes
基于Go实现简单的倒排索引源码+数据+sql数据库.zip基于Go实现简单的倒排索引源码+数据+sql数据库.zip基于Go实现简单的倒排索引源码+数据+sql数据库.zip基于Go实现简单的倒排索引源码+数据+sql数据库.zip基于Go实现...
人工智能-hadoop
MapReduce程序 完整实验报告 和 jar包 和简单实验数据
课堂学习搜索引擎,初步用简单的C语言实现了构建倒排索引和中文少字数搜索,代码可以帮助初学者了解搜索引擎的基础结构,可直接运行,内含word文档具体解释
简单搜索引擎,实现了拼写检查、倒排索引 、文档排序。 HW10.py: python2版本的拼写检查 HW10_PY3.py: python3版本的拼写检查 daopaisuoyin.py: 倒排索引(python3版) 主要代码是Correct.py,main.py,其他...
绝对是最简单的,仅供参考,希望大家不要吐槽,不足之处希望大家指出=。=
Elasticsearch通过倒排索引的数据结构来实现全文搜索 在关系数据库系统里,索引是检索数据最有效率的方式。但对于搜索引擎,它并不能满足其特殊要求,比如海量数据下比如百度或者谷歌要搜索百亿级的网页,如果使用...
java简单的网页搜索实现,包含网页爬虫、词素分词、倒排索引、拼写校正、计算文档相似度等内容.zip
设计实现了一种基于倒排索引的文件格式,建立了从波形数据到属于该束激光脉冲的点云的倒排映射关系,消除了LAS1.3文件中波形数据访问的无序性,也大大降低了波形数据处理过程中程序访问的复杂性。实验表明,新的索引...
一个使用倒排索引和向量空间模型的简单信息检索项目。 1)源代码只是一个python文件ir.py。 2)代码是用Python 2.7编写的。 3)代码中的query_file和base_dir变量要分别设置为query文件和blogs目录。 4)查询...
本项目提供一个简单索引构建工具,使用注解即可实现索引自动创建与搜索,而不需要你手写该过程, 避免项目中大量使用like或者其他效率低的搜索机制,相比于ES(专业搜索引擎)... 基于倒排索引,避免全量匹配和手动分词
支持倒排索引字段,正排索引字段,仅仅储存不进行检索的字段 倒排索引支持 完全匹配的字符串(类似ID,ISBN等需要完全匹配的属性) 分词类型 (全文索引) 根据特殊标志符进行切分的模式 正排索引支持 数字索引(暂时...
使用spark sql模拟带倒排索引的简单搜索引擎演示: :
MySQL默认使用innodb引擎,底层采用b+树的方式来实现,而Es底层使用倒排索引的方式实现,使用倒排索引支持各种维度的分词,可以掌控不同粒度的搜索需求。(MYSQL8版本也支持了全文检索,使用倒排索引实现,有兴趣...
索引模块:构建和保存索引,这里的索引是指倒排索引 搜索模块:搜索主逻辑,采用 BM25 算法计算 query 与 document 之间的相似度 项目的目录结构如下: main.py:入口文件 models.py:各模块定义 config.ini :...