2008-10-06 51 views
8

我想用Google App Engine编写一个web应用程序(所以参考语言应该是Python)。我的应用程序需要一个简单的搜索引擎,因此用户将能够找到指定关键字的数据。构建一个全文搜索引擎:从哪里开始

例如,如果我有一个表的那些行:

1办公空间
2 2001:空间 奥德赛
3巴西

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

什么是以简单的方式做到这一点的技术指导方针/算法?
你能给我提供一个很好的背景理论指针吗?

谢谢。

编辑:我不在这里寻找任何复杂的东西(比如说索引吨数据)。

回答

4

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

App Engine包含全文搜索引擎的基础知识,并且有一个描述如何使用它的great blog post here

还有一个feature request in the bug tracker最近似乎正在引起一些关注,因此如果可以的话,您可能需要坚持,直到实施。

6

我发现这两本书在我用来构建全文搜索引擎时非常有用。

Information Retrieval

Managing Gigabytes

+0

我还没有阅读/看过信息检索,但我已经使用了管理千兆字节,除了基本上覆盖了制作全文搜索和检索系统所需的所有内容外,它实际上非常易读。 – olliej 2008-10-08 02:33:51

3

一如往常,在wikipedia开始。首先开始通常是建立一个倒排索引。

1

首先建立您的索引。 经过输入,分解成文字
对于每个单词检查它是否已经在索引中,如果是将当前记录编号添加到索引列表中,如果没有添加单词和记录编号。
要查找单词,请转到(可能已排序)索引并返回该单词的所有记录编号。
对于使用Python内置存储类型的可扩展大小列表来说,这样做非常容易。

作为一种额外的改进,您只需要存储单词的基本部分,例如'find'用于'查找' - 查找词干算法。

+0

如果用“索引”表示“映射”或“字典”,那么这就是工作。如果你的意思是这样,那么就把“排序”这个词取出来,因为Python字典是从键到值的散列。 – 2008-10-07 00:55:39

+0

我的意思是一般(书籍/ DB)意义上的索引。 python中的哪个容器最好实现它是一个单独的问题。 – 2008-10-07 01:49:43

+0

除了Python字典之外,没有其他选择。因此建议您考虑放弃“排序”。 – 2008-10-07 09:51:26

0

老实说,聪明的人比我想象出来的东西。我会加载solr应用程序,并从我的appengine应用程序发出json调用,并让solr负责索引。

3

这里是原来的想法:

不要建立索引。认真。

我前段时间面临类似的问题。我需要一种快速的方法来搜索来自文档的文本和megs文本。我需要匹配的不仅仅是单词,而是大文件中的文字接近(这个词附近那个单词)。我刚刚用C写完,速度让我感到惊讶。它速度很快,不需要任何优化或索引。由于现代计算机的速度,如果您编写的代码直接在金属上编译(编译代码),您通常不需要订单日志(n)类型的算法来获得所需的性能。

7

阅读Tim Bray的series of posts on the subject

  • 背景
  • 搜索引擎
  • 基础
  • 精度和使用召回
  • 搜索engne智能
  • 整蛊搜索字词
  • 停用词
  • 国际
  • 排名结果
  • XML
  • 机器人
  • 要求列表
0

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

看起来不是太复杂做一个简单的(虽然它可能需要重优化是肯定的企业类型的解决方案)。我打算用Project Gutenberg的一些数据尝试一个概念验证。

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

3

LuceneAutonomy!这些都不是开箱即用的解决方案。你将不得不在他们的接口上编写包装器。
他们肯定会照顾词干,语法,关系运营商等

1

Introduction to Information Retrieval提供了一个很好的介绍该领域。

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

0

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

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

-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 

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