每周一个算法(1)---倒排索引

倒排索引 inverted index,第一次接触是在elasticsearch里面,里面的索引就是用的这个,其实es也是使用的Lucene作底层,inverted index是Lucene的核心算法。

网上说,“倒排索引”是实现单词到文档映射关系的最佳实现方式。

为什么叫做倒排索引呢?其实我认为中文翻译的这个名字并不好,(其实感觉编程上面的术语十有八九都没翻好,这也是阻碍程序员理解学习的重要原因之一,但是大家都这么叫了,你也得跟着这么叫,有的时候真正明白这个概念的时候,你确实觉得中文名字起的太差劲,所以经验就是:看到一个术语,立即去查英文,和英文文档),这个“排”字很有误导性,其实我觉得翻译成“反向索引”更好。

因为,inverted index的意思是,“使用内容来索引位置”,而不是通常的“使用位置索引内容”。

接下来,说说个人理解:

在Lucene中,对于一篇文档的处理,首先要Analyze,(对于英文来说)就是把“停用词”去掉,把大小写统一,把词性变化去掉(都还原成最原始的单词),ES里面也强调这个analyze的过程,并且支持用户指定analyzer(特定语言使用特定的analyzer)。

然后呢,就是建立索引的过程:

详细的过程就是这篇博客里写到的,灰常明白。

http://www.cnblogs.com/fly1988happy/archive/2012/04/01/2429000.html

基本意思就是对于一个词(关键词(也即上面analyze步骤生成的结果)),要统计出它所在的文章,出现的次数,以及在各个文章中的位置。

这样就对应生成了词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)

其中词典文件还记录了一些附加信息:该关键字指向频率文件和位置文件的指针,及field信息(关键字属于的字段)

时间: 2024-10-13 01:54:02

每周一个算法(1)---倒排索引的相关文章

每周学算法/读英文/知识点心得分享 1.28 - 2.1

每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! Algorithm: 学习算法 题目:String to Integer (atoi) 解题过程: 这题主要考虑异常情况,比如空字符串,开头 +/- ,非数字字符,空格,最大最小边界值处理.学到一个Char转Int技巧就是直接用字符减去‘0’获得差值就是数字. 第三次提交通过的. 解法:https://raw.githubusercontent.com/chy9966

每周学算法/读英文/知识点心得分享 2.4 - 2.8

每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! Algorithm: 学习算法 题目:https://leetcode.com/problems/zigzag-conversion/ 解题过程: 刚开始没看懂什么意思,看了两遍,明白是把字符串从上至下按照锯齿形排列,然后按行输出. 根据题目提示可以继续做一下延伸,把1-20 按 n=5 自己排列一下. 这种题一般有规律,找出要打印的字符在字符串里的下标,收集在一起就

每周学算法/读英文/知识点心得分享 3.4 - 3.8

每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! Algorithm: 学习算法 题目:Generate Parentheses 题目大意:给出n对小括号,求出括号匹配的情况,用列表存储并返回,例如:n=3时,答案应为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ] 解

请写一个算法,用于将list集合内重复元素剔除

package Homework; import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Scanner;/** * list集合是否可以包含重复元素? * 如果可以,请写一个算法,用于将list集合内重复元素剔除. * @author 张致远 * */public class Homework2 { public static void main(String[]

010给定一个循环链表,实现一个算法返回这个环的开始结点 (keep it up)

给定一个循环链表,实现一个算法返回这个环的开始结点. 定义: 循环链表:链表中一个结点的指针指向先前已经出现的结点,导致链表中出现环. 例子: 输入:A -> B -> C -> D -> E -> C [结点C在之前已经出现过] 输出:结点C 可以用一个map<node*,bool> 就解决问题了. 下面是编程之美上一种奇特的解法:快慢指针解法. 代码: struct SNode { int data; SNode* next; }; SNode* findCi

一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

4个字节表示的整数,总共只有2^32约等于4G个可能.为了简单起见,可以假设都是无符号整数.分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0.基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的.算法流程:1)分配500MB内存buf,初始化为02)unsigned int x=0x1;  for each int j in file  buf=buf|x<<j;  e

阿里巴巴 2015 实习笔试题 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出

分布式系统中的RPC请求经常出现乱序的情况. 写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是: 1 2 3, 4, 5 6 7, 8, 9, 10 上述例子中,3到来的时候会发现4,5已经在了.因此将已经满足顺序的整个序列(3, 4, 5)输出为一行. 要求: 1. 写一个高效的算法完成上述功能,实现要尽可能的健壮.易于维护 2. 为该算法设计并实现单元测试 貌似效率不是很高,有时间的时候改进下.

018给定二叉查找树的一个结点, 写一个算法查找它的“下一个”结点“(keep it up)

给定二叉查找树的一个结点, 写一个算法查找它的"下一个"结点(即中序遍历后它的后继结点), 其中每个结点都有指向其父亲的链接. 这个题本质就是线索化二叉树时找后继结点的题.找后继结点存在两种情况: 1 如果当前结点有右孩子,则后继结点为右孩子的最左结点 2 如果没有右孩子, A 当前结点为父结点的左孩子,则父结点就是后继结点 B 当前结点为父结点的右孩子,则向父结点找,直到当前结点不是父结点的右孩子终止,此时 父节点就是后继结点 代码: struct TreeNode { int da

009实现一个算法来删除单链表中的一个结点,只给出指向那个结点的指针(keep it up)

呵呵,这个题不能直接删除已知的结点,因为是单链表,不知道前驱,只知道 后继结点,直接删除会使链表断开.不过我们可以删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include <iostream> struct Node { int data; Node* next; }; bool removeNode(Node* vNode) { if (vNode == NULL || vNode->next == NULL) return false; Node* pNext =