【问题标题】:Assistance with building an inverted-index协助建立倒排索引
【发布时间】:2011-02-03 22:31:10
【问题描述】:

这是我为学校做的信息检索工作的一部分。该计划是使用单词的前两个字母作为键创建单词的哈希图,并将具有两个字母的任何单词保存为字符串值。所以,

hashmap["ba"] = "坏大麦基地"

一旦我完成了对一行的标记,我将获取该哈希图,对其进行序列化,并将其附加到以该键命名的文本文件中。

我的想法是,如果我将数据分散到数百个文件中,我将通过降低每个文件的密度来减少完成搜索所需的时间。我遇到的问题是,当我在每次运行中创建 100 多个文件时,无论出于何种原因,它碰巧在创建一些文件时窒息,因此这些条目是空的。 有什么方法可以提高效率吗?是否值得继续这样做,还是应该放弃它?

我想提一下我正在使用 PHP。我比较熟悉的两种语言是 PHP 和 Java。我选择 PHP 是因为前端操作起来非常简单,而且我可以毫无问题地添加自动完成/建议搜索等功能。我也认为使用 Java 没有任何好处。任何帮助表示赞赏,谢谢。

【问题讨论】:

  • 是否可以选择使用数据库?
  • 很遗憾没有。我必须自己索引和选择所有内容。

标签: php search search-engine information-retrieval inverted-index


【解决方案1】:

我会使用一个文件来获取和放置序列化的字符串。我也会使用 json 作为序列化。

放数据

$string = "bad barley base";
$data = explode(" ",$string);
$hashmap["ba"] = $data;

$jsonContent = json_encode($hashmap);
file_put_contents("a-z.txt",$jsonContent);

获取数据

$jsonContent = file_get_contents("a-z.txt");
$hashmap = json_decode($jsonContent);

foreach($hashmap as $firstTwoCharacters => $value) {
    if ($firstTwoCharacters == 'ba') {
        $wordCount = count($value);
    }
}

【讨论】:

  • 我正在处理一个 29mb 的 txt 文件。您不会认为包含 json_encode($hashmap) 的单个文件效率低下
  • 您可以分解到每个字母字符都有自己的文件的位置。 a.txt,b.txt,c.txt。对于搜索数据,是的,这会很费力。当添加发生时,您只能写入 a-z.txt。这真的取决于您将数据用于什么目的?
【解决方案2】:

您没有解释您要解决的问题。我猜你正在尝试制作一个全文搜索引擎,但你的 hashmap 中没有文档 ID,所以我不确定你是如何使用 hashmap 来查找匹配的文档。

假设您想要一个全文搜索引擎,我会考虑使用trie 作为数据结构。您应该能够将所有内容都放入其中而不会变得太大。与您要索引的单词匹配的节点将包含包含该单词的文档的 ID。

【讨论】:

  • 你完全正确地假设我正在制作一个全文搜索引擎。我现在正在查看 trie 数据结构,这比我目前正在做的事情(这就是我上面描述的)效率更高。我现在正在寻找实现这一点,谢谢!
  • 转到此处ics.uci.edu/~chenli/pubs.html 并查看标题为 Efficient Interactive Fuzzy Keyword Search 的论文
猜你喜欢
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2014-11-12
  • 1970-01-01
相关资源
最近更新 更多