小编hul*_*aba的帖子

实现文档搜索引擎

问题背景


大家好,我正在根据提供的查询在一堆文档中搜索相关文档的项目。由于这是一个小型项目,我有一个典型的内存架构,我假设我没有超过 100 个文档,每个文档包含不超过 1000 个单词(一个单词不超过 10 个字符)。我收到很多查询,我必须尽可能快地处理查询(绝对不超过一秒)。

我的第一种方法(幼稚且不可扩展):


由于允许用户上传文档,每当我收到文档时,我都会查找“潜在”关键字并将关键字存储为键,将文档存储为值对或存储在 MYSQL 表中。显然,这必须手动完成,看起来不像程序员会做的。

我的第二种方法(稍微好一点):


我获取每个文档,扫描其中的每个单词并将这个单词添加到 Trie 数据结构中,因此对于 100 个文档,我必须搜索 100 次尝试,如果查询的长度为 l,则这种方法将采用最坏的 O(单词数)跨所有文档*最大单词的长度)以构建特里树并查询 O(查询长度)。这是很合理的。为了实现这一点,我将在每个文档中保留一个 Trie 根节点向量,并迭代每个 trie 节点并在每个 trie 中搜索。如果我得到至少一半的查询词匹配,我就会将该文档存储为潜在结果。结果,我不会提供超过一些截止数量的文件。

我对社区的问题:


我会问你如何看待我的方法?我如何优化它们,我可以在现有方法中做哪些其他改进?通过使用其他算法或数据结构可以更有效地完成这项工作吗?在网上冲浪时,我遇到了像 Boyer-Moore 和 Aho-Corasick 这样的算法,以及一些调整 Lucene Apache 实现的算法等的建议。你在这里有什么建议?

algorithm search full-text-search search-engine data-structures

4
推荐指数
1
解决办法
2053
查看次数

为什么不使用"new"运算符创建的对象获取相同的地址

通过这个问题,一个答案说创建的对象在其范围之外被销毁.为了清楚地理解这个概念,我编写了以下代码:

#include <iostream>

using namespace std;

struct Node{
    int val;
    Node *next;
    Node(int x) : val(x) , next(NULL){}
};

int main(){
    for(int i=0;i<10;i++){
        int someval = rand()%100;
        Node somenode = Node(someval);
        printf("Address for object %d is %p \n",i+1, &somenode);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Address for object 1 is 0x7ffc32ff26b0 
Address for object 2 is 0x7ffc32ff26b0 
Address for object 3 is 0x7ffc32ff26b0 
Address for object 4 is 0x7ffc32ff26b0 
Address for object 5 is 0x7ffc32ff26b0 
Address for object 6 is 0x7ffc32ff26b0 …
Run Code Online (Sandbox Code Playgroud)

c++ new-operator

2
推荐指数
2
解决办法
164
查看次数