1. 索引
1. 索引的原理是什么?
对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找(或者其他方式)快速找到要查找的行的地址,再根据地址直接取行数据。
2. 为什么称为倒排索引?
英文原名为 Inverted index,失败地被翻译成了倒排索引。
-
3. 反向索引的记录数会不会很大?
英文单词的大致数量是10万个。
- 汉字的总数已经超过了8万,而常用的只有3500字。
- 《现代汉语规范词典》比《现代汉语词典》收录的字和词数量更多。前者是13000多字,72000多词,后者是11000多字,69000多词。
2. 搜索引擎
1. 为什么需要搜索引擎?
- 数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要的实时性。
数据举例:
-
3. 常用的中文分词器
IKAnalyzer
-
4. 如何选择分词器
准确率
- 分词效率
-
5. 你、我、他、的、地、了、标点符号……这些需要为其创建索引吗?
-
6. 复杂的相关性计算模型
tf-idf 词频-逆文档率模型。
- 向量空间模型。
- 贝叶斯概率模型,如: BM25。
3. Tf-idf 相关性计算模型详解
1. tf
- tf: term frequency 词频,指一个词在一篇文档中出现的频率。
tf_(t,d) = 词t在文档d中的出现次数 / 文档d的总词次数。
2. df
df: document frequency 词的文档频率,指包含某个词的文档数(有多少文档中包含这个词)。df越大的词越常见。
- df值越大,这个词在文档集中越不重要。
-
3. idf
idf: inverse document frequency 词的逆文档频率,用来表示词在文档集中的重要性。文档总数/df,df越小,词越重要,这个值会很大,那就对它取个自然对数,将值映射到一个较小的取值范围。
- idf_t = log(文档集的总文档数/(包含词t的文档数+1)),+1是为了避免除 0。
4. tf-idf相关性计算模型
t%20%3D%20tf%7Bt%2Cd%7D%20*%20idft#card=math&code=%28tf-idf%29_t%20%3D%20tf%7Bt%2Cd%7D%20%2A%20idf_t&id=55a16316)4. Java开源搜索引擎
- Nutch、Solr、Elasticsearch 等都依赖于 Lucene。
- Lucene: Apache 顶级开源项目,Lucene-core 是一个开放源代码的全文检索引擎工具包。
- Nutch: Apache 顶级开源项目,包含网络爬虫和搜索引擎(基于 lucene)的系统(如百度、google)。Hadoop 因它而生。
- Solr: Lucene 下的子项目,基于 Lucene 构建的独立的企业级开源搜索平台,一个服务。它提供了基于 xml/JSON/http 的 api 供外界访问,还有 web 管理界面。
- Elasticsearch: 基于 Lucene 的企业级分布式搜索平台,它对外提供 restful-web 接口,让程序员可以轻松、方便使用搜索平台,而不需要了解 Lucene。