13

我想使用Google App Engine编写一个 Web 应用程序(所以参考语言是Python)。我的应用程序需要一个简单的搜索引擎,以便用户能够找到指定关键字的数据。

例如,如果我有一个包含这些行的表:

1 办公空间
2 2001:太空漫游
3 巴西

并且用户查询“空间”,将返回第 1 行和第 2 行。如果用户查询“办公空间”,结果也应该是第 1 行和第 2 行(第 1 行在前)。

以简单的方式执行此操作的技术指南/算法是什么?
你能给我指出这背后的理论吗?

谢谢。

编辑:我不是在这里寻找任何复杂的东西(例如,索引大量数据)。

4

13 回答 13

8

阅读 Tim Bray关于该主题的系列文章

  • 背景
  • 搜索引擎的使用
  • 基本
  • 准确率和召回率
  • 搜索引擎智能
  • 棘手的搜索词
  • 停用词
  • 元数据
  • 国际化
  • 排名结果
  • XML
  • 机器人
  • 需求清单
于 2008-10-07T02:06:11.550 回答
6

当我过去构建全文搜索引擎时,我发现这两本书非常有用。

信息检索

管理千兆字节

于 2008-10-06T21:14:52.433 回答
4

如果可能的话,我不会自己建造它。

App Engine 包含全文搜索引擎的基础知识,这里有一篇很棒的博客文章介绍了如何使用它。

错误跟踪器中还有一个功能请求最近似乎受到了一些关注,因此如果可以的话,您可能希望坚持到实现为止。

于 2008-10-07T02:30:26.477 回答
3

一如既往地从维基百科开始。首先开始通常是建立一个倒排索引。

于 2008-10-06T21:21:49.953 回答
3

这是一个原始的想法:

不要建立索引。严重地。

前段时间我也遇到过类似的问题。我需要一种快速的方法来搜索来自文档的大量文本。我不仅需要匹配单词,还需要匹配大型文档中的单词邻近度(这个词是否靠近那个词)。我刚刚用 C 语言编写了它,它的速度让我感到惊讶。它足够快,不需要任何优化或索引。

以当今计算机的速度,如果您编写直接在金属上运行的代码(编译代码),您通常不需要 order log(n) 类型的算法来获得所需的性能。

于 2008-10-06T22:58:42.723 回答
3

Lucene自治!这些不是为您提供开箱即用的解决方案。您将不得不在其接口之上编写包装器。
他们当然会处理词干、语法、关系运算符等

于 2008-10-07T10:41:51.430 回答
1

首先建立你的索引。遍历输入,拆分为单词
对于每个单词检查它是否已经在索引中,如果是则将当前记录号添加到索引列表中,如果没有则添加单词和记录号。
要查找一个单词,请转到(可能已排序的)索引并返回该单词的所有记录编号。
使用 Python 的内置存储类型为合理的大小列表执行此操作非常容易。

作为一个额外的改进,您只想存储单词的基本部分,例如“find”用于“finding” - 查找词干算法。

于 2008-10-06T21:59:14.967 回答
1

《信息检索简介》一书很好地介绍了该领域。

死树版本由剑桥大学出版社出版,但您也可以通过上面的链接找到免费的在线版本(HTML 和 PDF)。

于 2008-10-08T01:37:25.493 回答
0

另请参阅我提出的问题:How-to: Ranking Search Results

当然还有更多的方法,但这是我现在使用的方法。

于 2008-10-06T21:23:36.427 回答
0

老实说,比我更聪明的人已经弄清楚了这些东西。我会加载 solr 应用程序并从我的 appengine 应用程序进行 json 调用,然后让 solr 处理索引。

于 2008-10-06T22:49:56.937 回答
0

我这个周末才发现这篇文章:http ://www.perl.com/pub/a/2003/02/19/engine.html

做一个简单的看起来并不太复杂(尽管它肯定需要大量优化才能成为企业类型的解决方案)。我计划使用古腾堡项目的一些数据来尝试概念验证。

如果您只是在寻找可以探索和学习的东西,我认为这是一个好的开始。

于 2008-10-07T02:40:28.580 回答
0

查看“管理千兆字节”一书,它涵盖了大量纯文本数据的存储和检索——例如。压缩和实际搜索,以及可用于每种算法的各种算法。

同样对于纯文本检索,您最好使用基于矢量的搜索系统而不是关键字->文档索引系统,因为基于矢量的系统可以更快,更重要的是可以相对简单地提供相关性排名。

于 2008-10-08T02:26:31.853 回答
-1

试试这个:假设变量表是您的搜索条目列表。

query = input("Query: ").strip().lower()#Or raw_input, for python 2
end = []
for item in table:
    if query in item.strip().lower():
        end.append(item)

print end #Narrowed results

它只是遍历所有项目以查看查询是否在其中任何一项中。它适用于简单的应用内搜索功能。不过,也许不适用于整个互联网。

于 2017-01-04T21:45:06.197 回答