真正有效的 Django 搜索引擎解决方案?
Posted
技术标签:
【中文标题】真正有效的 Django 搜索引擎解决方案?【英文标题】:Search engine solution for Django that actually works? 【发布时间】:2011-01-24 08:41:17 【问题描述】:到目前为止的故事:
决定使用 Xapian 作为搜索后端,因为它具有我正在寻找的所有搜索引擎功能,了解 Unicode,词干提取,几乎没有依赖项,并且不需要在其上安装臃肿的应用服务器。
尝试过 Django 和 Haystack(加上 xapian-haystack,将 Haystack 与 Xapian 绑定的后端胶水代码),因为它在相当多的博客上被宣传为“工作”。不工作。 django-haystack 和 xapian-haystack 项目都没有提供实际协同工作的版本组合。两个项目的 MASTER 都会从 Xapian 产生错误,因此它根本不稳定。 Haystack 1.0.1 和 xapian-haystack 1.0.x/1.1.0 不兼容 API。另外,在 Haystack 1.0.1 和 xapian-haystack MASTER 的最低工作安装中,由于 django-haystack 或 xapian-haystack 中的错误(我对此进行了双重验证),任何复杂的查询都会产生零结果,可能是因为单元测试实际上测试非常简单的情况,根本没有边缘情况。
尝试过 Djapian。源代码充满了拼写错误(请注意,在变量名中,而不是 cmets),文档也充满了歧义和过时的信息,这些信息永远不会导致安装工作。毫不奇怪,用户很少询问功能,而是首先询问如何使其工作。
下一步:探索 Solr(安装 Java 环境和 Tomcat 让我很头疼,这台机器受 RAM 和 CPU 限制)或 Lucene(稍微不那么头疼,但仍然如此)。
在我继续花更多时间研究可能会或可能不会像宣传的那样有效的解决方案之前,我想知道:有没有人获得过在 Django 中工作的实际搜索解决方案?我是认真的。我发现阅读“大部分已解决的大问题”真的很令人沮丧,然后意识到您永远无法从源代码中获得有效的安装,因为实际上,所有处理这些“大部分已解决的问题”的博主都没有通过基本安装和复制粘贴官方教程。
所以这里是要求:
必须能够在一个查询中搜索 10-100 个字词 必须处理 +(术语必须存在)和 -(术语不能存在),AND/OR 必须处理任意分组(即 AND/OR 周围的括号) 必须允许在全文搜索之前或之后进行 Django-ORM 过滤(即使用 Django 知道的全套过滤器对结果进行预处理/后处理) 或者,必须有一个工具来批量获取结果集并将其转换为 QuerySet 机器上应该很轻,所以最好不要安装庞大的 JVM 和基于 Java 的应用服务器有什么东西可以做到这一点吗?我对轶事证据或对一些声称它应该有效的博客文章的引用不感兴趣。我想听听有人在现实世界中,在真实条件下,通过真实的查询实际拥有完整的功能设置。
编辑:
让我再重复一遍,我对传闻证据并不感兴趣,即某人在某处有一个正在运行的安装使用未指定的属性。我已经去那里了,我阅读了所有的博客文章、邮件列表,我联系了作者,但是当涉及到实际场景的实际实施时,没有任何东西能像宣传的那样奏效。
另外,下面的一位用户也提出了这一点,考虑到任何项目的 TCO,我绝对不想听到有人在某个地方能够在供应商以未知数量的空降时实现它专家用无处记录的特定领域知识对整个安装进行猴子修补。
所以,如果您声称您的工作安装实际上满足完整搜索的最低要求(请参阅上面的要求),请提供以下内容,以便我们都能从 Django 的搜索解决方案中受益解决问题:
确切的 Linux 发行版,发布版本, Haystack(或同等版本)的确切发布版本和搜索后端的发布版本, 搜索引擎的确切发布版本 公开 (!) 可用的文档,如何完全按照您的安装设置方式设置所有组件,以满足上述最低要求。谢谢。
【问题讨论】:
恐怕你有一个非常有效的观点。我一直在尝试将 djapian 或 haystack+xapian-haystack 插入一个网站,该网站具有在 mysql 中使用 LIKE 实现的工作搜索功能,到目前为止,准备一个可复制的工作设置似乎是一场噩梦。我已经抛弃了 Djapian 并使用了 haystack,但即使它上手非常快,我也发现了一些错误(或文档短缺,我还不确定)。 【参考方案1】:简短回答:不。
我们选择了 Google 自定义搜索。尽管该站点有超过 10,000 次可能的页面浏览量,但我们将站点地图馈送保持在 4,000 个左右的主要页面,并且每年花费 250 美元,这大约是我的 2 小时时间。客户很高兴,他对结果感到满意。
我很乐意看到有人提出一个好的 FOSS 解决方案,但在商业情况下,TCO 必须具有经济意义。
【讨论】:
【参考方案2】:我(和我的同事)已经成功使用 Haystack 实现了相当不错的搜索功能。
从 haystack 和 whoosh 后端开始很容易;并在 whoosh 的性能不可接受时更改为 Apache-Solr 后端。
我们真的需要写一篇关于它的详细帖子,其中包含指向它工作的项目的链接。
现在我可以建议你看看这个搜索:http://www.webdevjobshq.com/search/?q=rails 使用 Haystack 和 Apache-Solr 后端实现。或者这个:http://www.govbuddy.com/search/?q=Roy
【讨论】:
我很想知道您是如何工作的,以及您使用的确切版本,包括操作系统版本(例如,Ubuntu 9.10 上的 Solr 很痛苦,因为没有适用于Tomcat 5.5 不再,因此无法安装 solr-tomcat5.5 包,这意味着要拉取和编译很多依赖项。 另外,Whoosh 处理多少个搜索词? Whoosh 是否在实际开发中?从项目的 Trac 站点来看,它已经停滞不前,致命错误仍然存在。 Trac 站点已过时,Whoosh 已移至 bitbucket:bitbucket.org/mchaput/whoosh/changesets,并且仍在积极开发中。 请注意,两个链接现在都指向非功能性搜索引擎。 :)【参考方案3】:我使用日文。安装非常简单,效果很好。有一个涵盖基本用例并展示整个集成过程的实际教程。
是的,它有一些歧义,但问题跟踪器是开放的,作者可以快速修复错误并添加功能。
【讨论】:
我已按照教程进行操作,但它不起作用。请告诉我您使用的确切版本可以实现完全正常的安装,并且实际上适用于现实世界的场景。【参考方案4】:你考虑过Sphinx吗?您使用什么作为数据存储?它有一个非常棒的 MySQL 引擎。我认为它满足您的大部分要求,但我不确定它与 Django-ORM 的结合程度如何。
我正在认真考虑在我自己的一个 Django 应用程序中使用 Sphinx 来提高自动建议字段的性能,该字段对 350 万条记录的语料库进行前缀和中缀搜索。但是我还没有开始实施它,所以我不能谈论 Django+Sphinx 的集成。我唯一的 Sphinx 经验是使用 MySQL 引擎并直接查询 MySQL。
【讨论】:
这正是问题所在。过去我偶然发现了 Sphinx,但我从未见过任何人或读过有关如何在真实场景中将 Sphinx 实际集成到 Django 中的信息,包括实际兼容的特定版本号。来自 django-sphinx 的作者用他自己的话来说的关键词:“安装后,您需要在 settings.py 中编辑一些设置,因为我很讨厌文档,所以没有在网站上发布。”我不会碰这个的,对不起。 我的 django-sphinx 工作正常。我正在使用两者的最新版本,并且中缀和前缀搜索效果很好。他们创建了大量的索引,但除此之外,他们工作。是的,django-sphinx 的文档不是很好,但已经足够了。它的美妙之处在于它实际上是一个相当小的连接器,如果它不能像您期望的那样工作,您可以弄清楚发生了什么。 Sphinx 相当强大和快速,论坛的支持也不错。而且他说的设置没有发布......我相信它们已经发布在项目网站上。 Sphinx 很棒,但 django-sphinx 是一场灾难。省去麻烦,试试别的吧。【参考方案5】:我也开发了一些支持 xapian 的 Django 应用程序。其中最大的有一个 xapian 数据库,其索引为 8G,存储了 240 万份文档(包括论坛帖子、维基条目、行星条目和博客条目)——仍在增长。
总的来说,我对 xapian 很满意。它性能非常好并且易于使用。我唯一不喜欢的是 xapian 由于死锁而无法与 mod_wsgi 一起使用(全局模式除外)。所以你不得不使用fastcgi(或者连接xapian-tcpsrv或者自己写服务)。
我建议你直接使用 xapian-bindings。 Xapian 现在提供了很多有用的帮助程序(TermGenerator、QueryParser 等),这使得索引和查询都变得简单。事实上,我无法想象任何东西可以证明额外的库是合理的。在我看来,它们都比较复杂,不能让您有效地建立索引。
您唯一需要的是了解 xapian 的工作方式。 (什么是术语?什么是值?什么是词干,我应该在哪里使用它?等等)。您可以在 xapian 网站上找到所有这些主题,一旦您了解了这些概念,处理 xapian 就会变得容易。
此外,xapian API 非常稳定。在 1.0 版本发布之前我已经开始使用它很长时间了,并且从未遇到过 API 更改或版本冲突的任何问题。唯一改变的是,我曾经为我的 Django 项目编写的所有帮助程序(查询解析器、标记器等)现在都没有用了,因为类似的类已经进入了 xapian 核心。
所以,总结一下,直接试试 xapian-bindings 的用法吧。
【讨论】:
【参考方案6】:我可以在真实的生产环境中使用 Xapian 后端(为了充分披露,我是 xapian-haystack 后端的作者)担保 Django-Haystack。我们目前在多个网站上使用 Haystack/Xapian,其中最大的一个拥有超过 20,000 名注册用户和一个 Xapian 数据库,其中包含 20,000 多个文档,其中包含超过 143,000 个唯一术语,总大小约为 141mb。
至于无法运行 Haystack 和 Xapian 后端的任何组合,我承认我在标记方面没有像应有的那样勤奋,因此版本有些混乱。但是,您应该能够毫无问题地使用两个代码库的当前主控。如果不是这种情况,我将非常乐意协助解决问题。不过,您需要对这个问题更具体一点。仅仅说“它不起作用”是不够的。
Daniel 和我都尽最大努力及时回应在 Github 上提出的任何问题。此外,我们通常白天都可以在#haystack IRC 频道和 django-haystack Google Group 上找到。
使用的版本:
Haystack 1.0BETA 与 Xapian-Haystack 1.1.0BETA Haystack 1.0.1FINAL 与 Xapian-Haystack 1.1.3BETA我们使用 Haystack 部署的大多数站点都运行 Ubuntu 8.04 LTS 和 Xapian 1.0.5
【讨论】:
【参考方案7】:您要求的详细信息。
确切的 Linux 发行版,发布版本 - Ubuntu 9.04 和 9.10 Haystack(或同等版本)的确切发布版本 - Haystack 1.0 以及 master 搜索后端的发布版本 - Haystack 中包含的 Solr 和 Whoosh 后端 搜索引擎的确切发布版本 - Solr 1.3、Solr 1.4 和 Whoosh 0.3.15 公开 (!) 可用的文档,如何完全按照您的安装设置方式设置所有组件,从而满足上述最低要求。 http://docs.haystacksearch.org/dev/installing_search_engines.html#solr(或#whoosh)除此之外,它是本教程中的标准配置位,以及任何额外的覆盖(我无法链接到,感谢 Stack Overflow)。
作为 Haystack 的维护者,我正在积极运行上述所有之前的设置。最小的 Haystack 安装(Haystack 1.0 + Whoosh)大约是 600 个文档。一个稍大的(Haystack master + Solr 1.4)大约是 4000 个文档。我所知道的最大部署(Haystack master + Solr 1.4)是大约 300 万个文档。
我通常会尽量避免 Stack Overflow,所以如果您从我这里看不到任何东西,请不要感到惊讶。邮件列表是获得支持的最佳场所,但鉴于您迄今为止的回复,我相信您宁愿把我扔在这里。
【讨论】:
如果您将“提出精确问题以验证开发人员提出的声明”标记为“垃圾”,那很好。我想说的是,如果你作为 Haystack 的开发者只安装了 600 到 4000 个索引文档,你不应该声称你的软件适合现实世界——因为你没有t 验证它呢。另外,我已经尝试过上述版本 - Ubuntu 9.x 上的 Solr 是不行的,因为没有 Tomcat 5 包,Haystack/xapian-haystack 的 master 不稳定等等。所以我不行。跨度>以上是关于真正有效的 Django 搜索引擎解决方案?的主要内容,如果未能解决你的问题,请参考以下文章
GitHub痛改代码搜索引擎,18小时给155亿个文档创建索引,背后技术原理已公开...