美文网首页
500. 反向索引

500. 反向索引

作者: 6默默Welsh | 来源:发表于2018-05-04 16:11 被阅读26次

描述

创建给定文档的反向索引
确保数据不包含标点符号.

样例

给出一个包括id与内容的文档list(我们提供了document类)

[
{
"id": 1,
"content": "This is the content of document 1 it is very short"
},
{
"id": 2,
"content": "This is the content of document 2 it is very long bilabial bilabial heheh hahaha ..."
},
]
返回一个反向索引(hashmap的key是单词, value是文档的id).
{
"This": [1, 2],
"is": [1, 2],
...
}

说明
文档是有许多的单词组成的,其中每个单词也可以在同一个文档中重复出现很多次,当然,同一个单词也可以出现在不同的文档中。

  1. 正排索引(forward index):从文档角度看其中的单词,表示每个文档(用文档ID标识)都含有哪些单词,以及每个单词出现了多少次(词频)及其出现位置(相对于文档首部的偏移量)。
  2. 倒排索引(inverted index,或inverted files):从单词角度看文档,标识每个单词分别在那些文档中出现(文档ID),以及在各自的文档中每个单词分别出现了多少次(词频)及其出现位置(相对于该文档首部的偏移量)。

简单记为:正排索引:文档 ---> 单词倒排索引:单词 ---> 文档
倒排索引有着广泛的应用场景,比如搜索引擎、大规模数据库索引、文档检索、多媒体检索/信息检索领域等等。总之,倒排索引在检索领域是很重要的一种索引机制。

代码

/**
 * Definition of Document:
 * class Document {
 *     public int id;
 *     public String content;
 * }
 */
public class Solution {
    /**
     * @param docs a list of documents
     * @return an inverted index
     */
    // 正向索引是遍历文件查找关键词
    // 反向索引是通过关键词得到具有该关键词的文件 id
    public Map<String, List<Integer>> invertedIndex(List<Document> docs) {
        Map<String, List<Integer>> results = new HashMap<String, List<Integer>>();
        for (Document doc : docs) {
            int id = doc.id;
            StringBuffer temp = new StringBuffer("");
            String content = doc.content;
            int n = content.length();
            for (int i = 0; i < n; ++i) {
                // if 判断条件成立表示遍历完了一个关键词
                // temp 一次只存储一个关键词
                if (content.charAt(i) == ' ') {
                    insert(results, temp.toString(), id);
                    temp = new StringBuffer("");
                } else
                    temp.append(content.charAt(i));
            }
            // 最后一个关键词的插入
            insert(results, temp.toString(), id);
        }
        return results;
    }

    // insert 功能把关键字和 id 对应
    // tmp 即为关键字
    public void insert(Map<String, List<Integer>> rt, String tmp, int id) {
        // tmp 关键字不存在
        if (tmp.equals("") || tmp == null)
            return;
        // 建立 HashMap 
        if (!rt.containsKey(tmp))
            rt.put(tmp, new ArrayList<Integer>());
        
        int n = rt.get(tmp).size();
        // hash 表中的 id 的内容不存在或者已经存在的 id 和要添加的 id 不一致,把 id 加入 hash 表
        if (n == 0 || rt.get(tmp).get(n - 1) != id)
            rt.get(tmp).add(id);
    }
}

相关文章

  • 500. 反向索引

    描述 创建给定文档的反向索引确保数据不包含标点符号. 样例 给出一个包括id与内容的文档list(我们提供了doc...

  • 什么是倒排索引

    什么是倒排索引? 维基百科:倒排索引(英语:inverted index),也常被称为反向索引、置入档案或反向档案...

  • ElasticSearch初识(二)

    什么是正向索引、什么是倒排索引? 正向索引(forward index),反向索引(inverted index)...

  • python索引原理

    python能够反向索引,从最后一个开始(正向索引是从左边开始计算,反向索引是从右边开始计算),一般来说,负的索引...

  • Oracle 索引学习

    创建索引 标准语法 唯一索引 组合索引 反向键索引 示例 删除索引 修改索引 重建索引 联机重建索引 合并索引

  • 倒排索引

    见其名知其意,有倒排索引,对应肯定,有正向索引。正向索引(forward index),反向索引(inverted...

  • 正排索引和倒排索引

    倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,被用来存储在全文搜索下某个...

  • Lucene索引讲解

    1、IndexWriter详解 问题1:索引创建过程完成什么事? 分词、存储到反向索引中。 Lucene索引创建A...

  • 0x03.索引

    [TOC] 索引是映射类型的容器。ES的索引中存储数据和索引(反向索引)。索引实质上只是逻辑单元,实际的存储单元是...

  • mysql面试题总结

    1.索引是什么?索引用来快速找到某些特定值的记录,反向来说就是

网友评论

      本文标题:500. 反向索引

      本文链接:https://www.haomeiwen.com/subject/kcbdrftx.html