搜索引擎(lucene及周边) 涉及的一些算法总结
一)分词
1)正向/逆向最大匹配算法
典型:IKAnalyzer采用的是正向迭代最细粒度切分算法
IKAnalyzer源码简单分析:
http://www.cnblogs.com/huangfox/p/3282003.html
2)字典树(trieTree)
trieTree实现
http://www.cnblogs.com/huangfox/archive/2012/04/27/2474185.html
中文分词遇到的问题:
a)标准trieTree节点采用数组存储指针,如果是英文a-z用26长度的数组表示,但是中文不能用这种存储方式,节点数组长度等于中文字数。(内存撑不住!)
b)如何节点内部查询?采用数组进行二分查找,或者采用map。(ik结合了这两种方式)
具体还可以参考:
http://hxraid.iteye.com/blog/618962
3)消歧算法
4)新词识别算法(机构名、品牌名、专业名词、缩略语、网络新词等)
具体参考:
http://www.programmer.com.cn/12276/
二)索引
1)压缩算法
前缀后缀规则、差值规则
2)跳跃表
为了提高查找的性能,Lucene在很多地方采取的跳跃表的数据结构。
跳跃表(Skip List)是如图的一种数据结构,有以下几个基本特征:
- 元素是按顺序排列的,在Lucene中,或是按字典顺序排列,或是按从小到大顺序排列。
- 跳跃是有间隔的(Interval),也即每次跳跃的元素数,间隔是事先配置好的,如图跳跃表的间隔为3。
- 跳跃表是由层次的(level),每一层的每隔指定间隔的元素构成上一层,如图跳跃表共有2层。

节选自:http://forfuture1978.iteye.com/blog/546824
三)检索
1)文本相关性算法(tfIdf)
tfIdf的详细解释:
http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html
lucene打分过程:
http://www.cnblogs.com/huangfox/archive/2012/07/02/2573333.html
2)字段排序过程中——优先级队列
请参考:
http://www.cnblogs.com/huangfox/archive/2012/07/11/2586232.html
相关知识:
a)堆排序
http://www.cnblogs.com/huangfox/archive/2012/06/30/2571216.html
四)扩展
1)相似检索(MoreLikeThis)
关键步骤:
a)字频统计
b)去噪(黑名单、词条长度)
c)计算词权(tfIdf)
d)构建query
F)检索
具体参考:
http://www.cnblogs.com/huangfox/archive/2012/07/05/2578179.html
2)拼写检查(SpellingChecker)
关键算法:
a)N-gram
b)编辑距离
具体参考:
http://www.cnblogs.com/huangfox/archive/2012/02/14/2350349.html
3)电商排序模型
多因子综合排序(略)
----------------------------------------------------------------
其他
1)自动关键词的应用(牵涉到相似检索)
2)同义词、近义词的应用
搜索引擎(lucene及周边) 涉及的一些算法总结的更多相关文章
- 搜索引擎Lucene之皮毛
一.Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...
- STL之涉及到的算法
一.非变异算法 是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理.元素查找.子序列搜索.统计和匹配.非变异算法具有极为广泛的适用性,基本上可应用与各种容器. 1查找容器元素find 它用于查 ...
- [垂直化搜索引擎]lucene简介及使用
摘自:大型分布式网站架构-设计与实践
- Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法
2019独角兽企业重金招聘Python工程师标准>>> Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法 博客分类: java 搜索引擎 ...
- Lucene.net站内搜索—2、Lucene.Net简介和分词
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- 1、什么是Lucene,Lucene能干什么
1.什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让 ...
- Lucene.Net简介和分词
Lucene.net站内搜索—2.Lucene.Net简介和分词 2015-03-24 23:10 by 邹琼俊, 118 阅读, 1 评论, 收藏, 编辑 Lucene.Net简介 Lucene.N ...
- Solr vs. Elasticsearch谁是开源搜索引擎王者
当前是云计算和数据快速增长的时代,今天的应用程序正以PB级和ZB级的速度生产数据,但人们依然在不停的追求更高更快的性能需求.随着数据的堆积,如何快速有效的搜索这些数据,成为对后端服务的挑战.本文,我们 ...
- 搜索引擎Hoot的源码阅读(提供源码)
开门见山,最近阅读了一下一款开源引擎的源码,受益良多(学到了一些套路).外加好久没有写博客了(沉迷吃鸡,沉迷想念姑娘),特别开一篇.Hoot 的源码地址, 原理介绍地址.外加我看过之后的注释版本,当然 ...
随机推荐
- 获取列表中的最大的N项和最小的N项
获取列表中的最大的N项和最小的N项 #!/sur/bin/env python # -*- coding:utf-8 -*- # author:zengsf #time:2018/10/31 impo ...
- Error Downloading Packages: yum更新出现错误
yum install lrzsz 失败报错: 解决思路: 1:执行yum clean all 清除缓存目录下的软件包及旧的headers: 2:接着执行 yum list 重新列出所有已经安装和可 ...
- Vue的新启之笔
之前就有接触Vue这一语言,作为一个摊薄饼的我,觉得其基础性的知识体系与其他语言是相通的.且由于贵阳这一城市的地理位置的特殊性,我不得不承认想要从事软件开发这一行业,不精通一门语言不行.因为,任何一家 ...
- zzuli2226:神奇的薯条
题目描述 小明拿了n元钱去买薯条,薯条小份3元,大份7元.现在小明想知道如果只买薯条,自己的钱是否可以刚好花完,请你设计一个程序帮他计算一下. 输入 第一行输入一个整数T,表示实例数量.(1<= ...
- strchr与sscanf
strchr(s,',')返回字符串s中从左往右第一个字符's'的指针: sscanf(输入的字符或字符串,“%格式符”,存储值):
- [动态差分+二维前缀和][小a的轰炸游戏]
链接:https://ac.nowcoder.com/acm/contest/317/E来源:牛客网 题目描述 小a正在玩一款即时战略游戏,现在他要用航空母舰对敌方阵地进行轰炸 地方阵地可以看做是n× ...
- hdu6441 Find Integer (费马大定理)
#include<bits/stdc++.h> using namespace std; int main() { int T; scanf("%d",&T); ...
- 【BZOJ4566】【HAOI2016】找相同字符
后缀自动姬好,好写好调好ac 原题: 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同. 1 <=n1, n2< ...
- shell excute mongo query command
use shell command method one: #!/bin/bash ] then echo 'Please input cid' exit fi HOST= mongo ${HOST} ...
- zabbix使用自定义key进行监控
我的zabbix-server是安装在另一台虚拟机上的,用来监控下图中的这台虚拟机 先修改zabbix的客户端配置文件,增加UserParameter那行,这里我只是用来测试,所以就随便起了一个名为p ...