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相关性计算模型

    3.3-1. 搜索引擎核心理论思想 - 图1t%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。