首页 > 解决方案 > 如何在 mongodb 中按单词对数据进行分类?

问题描述

我是一个试图熟悉的学生MongoDB

我目前正在制作一个程序,Java该程序使用 twitter 流获取推文并使用MongoDB.

我已经完成了将推文保存到的工作MongoDB,现在我想按单词对这些推文进行分类。

像这样:

让我们说:

Tweet1 = " I am A" 
Tweet2 = "I am B"

我想做的是当我以某种方式对它们进行分类时,我希望它看起来像这样:

I :  Tweet1, Tweet2
Am : Tweet1, Tweet2
A : Tweet1
B : Tweet2

我必须为此使用索引吗?它实际上是在更改数据库还是只是通过索引搜索都没有关系。我只是希望我的结果看起来像这样。

这是我第一次使用数据库,所以所有这些索引和数据库的东西对我来说真的很困惑。

如果有人可以为此提供一些提示,那就太好了。

谢谢!

标签: javamongodb

解决方案


这是一个倒排索引。给定一个词,您想快速查找包含它的推文。下面是Java执行此操作的示例代码。在编写两个示例推文时,您将包含从MongoDB.

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.TreeMap;

public class SimpleInvertedIndex {

    public static void main(String[] args) {

        //inverted index
        Map<String, LinkedList<String>> index = new TreeMap<>();

        //tweets data
        Map<String, String> tweets = new HashMap<>();

        //Sample tweets
        tweets.put("Tweet1", " I am A");
        tweets.put("Tweet2", "I am B");

        //build the inverted index
        for (Map.Entry<String, String> entry : tweets.entrySet()) {
            String tweetId = entry.getKey();
            String[] values = entry.getValue().trim().split(" ");

            for (int i = 0; i < values.length; i++) {
                index.putIfAbsent(values[i], new LinkedList<>());
                LinkedList<String> updatedList = index.get(values[i]);
                updatedList.add(tweetId);
                index.put(values[i], updatedList);
            }
        }

        //verify by printing out
        for (Map.Entry<String, LinkedList<String>> entry : index.entrySet()) {
            System.out.print(entry.getKey() + " : ");
            System.out.print(entry.getValue());
            System.out.println();
        }
    }
}

输出:

A  : [Tweet1]
B  : [Tweet2]
I  : [Tweet2, Tweet1]
am : [Tweet2, Tweet1]

推荐阅读