我想使用Google App Engine编写一个Web应用程序(因此参考语言将是 Python )。我的应用程序需要一个简单的搜索引擎,因此用户可以找到指定关键字的数据。
例如,如果我有一个包含这些行的表:
1办公室空间2001年2月:一个空间 奥德赛3巴西
并且用户查询“space”,将返回第1行和第2行。如果用户查询“办公空间”,则结果也应为第1行和第2行(第1行)。
以简单的方式执行此操作的技术指南/算法是什么?
你能否指出我背后的理论指南?
感谢。
编辑:我不是在寻找任何复杂的东西(例如,索引大量数据)。
答案 0 :(得分:7)
阅读Tim Bray的series of posts on the subject。
- 背景
- 搜索引擎的使用
- 基本
- 精确和召回
- 搜索工程智能
- 棘手的搜索字词
- 停用词
- 元数据
- 国际
- 排名结果
- XML
- 机器人
- 要求清单
答案 1 :(得分:6)
答案 2 :(得分:4)
如果可能的话,我不会自己构建它。
App Engine包含全文搜索引擎的基础知识,还有great blog post here描述了如何使用它。
最近还有一个feature request in the bug tracker似乎引起了一些关注,所以如果可以的话,你可能想要坚持,直到实施。
答案 3 :(得分:3)
始终在wikipedia开始。第一次开始通常建立倒排索引。
答案 4 :(得分:3)
这是一个原创的想法:
不要构建索引。严重。
我前段时间遇到了类似的问题。我需要一种快速的方法来搜索来自文档的megs和megs文本。我需要不仅匹配单词,而且还要匹配大文档中的单词接近度(这个单词在附近该单词)。我刚刚用C编写它,它的速度让我感到惊讶。它足够快,不需要任何优化或索引。
凭借今天计算机的速度,如果您编写直接在金属上运行的代码(编译代码),您通常不需要订单日志(n)类型算法来获得所需的性能。
答案 5 :(得分:3)
答案 6 :(得分:1)
首先构建索引。
通过输入,分成单词
对于每个单词检查它是否已经在索引中,如果它是将当前记录号添加到索引列表,如果没有添加单词和记录号。
要查找单词,请转到(可能已排序)索引并返回该单词的所有记录号
使用Python的内置存储类型为可更新的大小列表执行此操作非常方便。
作为一个额外的改进,你只想存储一个单词的基本部分,例如'find'用于'发现' - 查找词干算法。
答案 7 :(得分:1)
本书Introduction to Information Retrieval为该领域提供了很好的介绍。
死树版本由剑桥大学出版社出版,但您也可以在上面的链接中找到免费的在线版本(HTML和PDF格式)。
答案 8 :(得分:0)
另见我提出的问题:How-to: Ranking Search Results。
当然有更多的方法,但这是我现在使用的方法。
答案 9 :(得分:0)
老实说,聪明的人比我想出这些东西。我将加载solr应用程序并从我的appengine app发出json调用,让solr负责索引。
答案 10 :(得分:0)
我本周末才发现这篇文章:http://www.perl.com/pub/a/2003/02/19/engine.html
看起来不太复杂,不能做一个简单的(虽然它需要大量优化才能确保成为企业级解决方案)。我打算尝试使用Project Gutenberg的一些数据进行概念验证。
如果您只是在寻找可以探索和学习的东西,我认为这是一个良好的开端。
答案 11 :(得分:0)
查看“管理千兆字节”这本书,它涵盖了大量纯文本数据的存储和检索 - 例如。压缩和实际搜索,以及可用于每种算法的各种算法。
同样对于纯文本检索,您最好使用基于矢量的搜索系统而不是关键字 - >文档索引系统,因为基于矢量的系统可以更快,并且更重要的是可以相对简单地提供相关性排名。 / p>
答案 12 :(得分:-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
它只是迭代所有项目以查看查询是否在其中任何一个中。它适用于简单的应用内搜索功能。但是,也许不适用于整个互联网。