1. 索引
1. 索引的原理是什么?
- 对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找(或者其他方式)快速找到要查找的行的地址,再根据地址直接取行数据。
2. 为什么称为倒排索引?
- 英文原名为 Inverted index,失败地被翻译成了倒排索引。
- 应该翻译为:反向索引。
3. 反向索引的记录数会不会很大?
- 英文单词的大致数量是10万个。
- 汉字的总数已经超过了8万,而常用的只有3500字。
- 《现代汉语规范词典》比《现代汉语词典》收录的字和词数量更多。前者是13000多字,72000多词,后者是11000多字,69000多词。
2. 搜索引擎
1. 为什么需要搜索引擎?
-
数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要的实时性。
-
数据举例:
- 结构化数据: 用表、字段表示的数据。
- 半结构化数据: xml、html。
- 非结构化数据: 文本、文档、图片、音频、视频等。
2. 中文分词器原理
- 有个词的字典,对语句前后字进行组合,与字典匹配,歧义分析。
3. 常用的中文分词器
- IKAnalyzer
- mmseg4j
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值越大,这个词在文档集中越不重要。
-
词t的tf高,在文档集中的重要性也高,文档与该词越相关。
3. idf
-
idf: inverse document frequency 词的逆文档频率,用来表示词在文档集中的重要性。文档总数/df,df越小,词越重要,这个值会很大,那就对它取个自然对数,将值映射到一个较小的取值范围。
-
idf_t = log(文档集的总文档数/(包含词t的文档数+1)),+1是为了避免除 0。
4. tf-idf相关性计算模型
(tf-idf)_t = tf_{t,d} * idf_t
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。