【问题标题】:best practices for text-based searches in database数据库中基于文本的搜索的最佳实践
【发布时间】:2012-01-23 18:58:09
【问题描述】:

我有一个应用程序,我需要在各种基于文本的字段中进行搜索。该应用程序是使用 NHibernate 作为 ORM 开发的。

我想在搜索中实现 Porter Stemming,以便即使关键字与相似词匹配也能够返回相关结果,例如产品描述包含 memories 而搜索关键字是 memory .

谁能建议此类搜索的最佳做法?想到的第一个想法是在数据库中存储同一字段的两个版本,例如:

Description
Description_Search

Description 列将是网站管理员输入的文本,并且是前端可见的文本。

Description_Search 将包含相同的文本,但通过了 Porter-Stemming 算法。然后搜索查询将基于Description_Search 字段,而不是Description

这有意义吗?存储几乎相同文本的两个版本是否浪费空间?

另外,Lucene.Net 会在这种情况下提供帮助吗?我也在考虑集成 Lucene.Net 以进行基于全文的搜索,但尚未详细研究。

提前致谢!

【问题讨论】:

标签: c# database search lucene.net porter-stemmer


【解决方案1】:

没有必要为此使用两个字段,一个就足够了。一个字段有两个“值”,一个是存储的,可以使用Document.Get(...) 检索,另一个是用于搜索的索引。存储值在技术上也不是必需的,一个常见的解决方案是存储一个用于在数据库中查找原始内容的 id。这还允许您查找更多信息,例如作者信息和文档位置。

Lucene.Net 在这种情况下会有所帮助,但它需要您自己编写基础架构。您需要注意配置分析器(通常无需配置),并为您的内容编制索引。正如评论中提到的,您可以使用 SQL Server 的全文搜索功能,但这本身有一些限制(可能不会影响您)。

我在使用 SQL Server 的 FTS 时遇到了一个大问题,但它在 Lucene.Net 中工作(这并不公平,因为你可以在 Lucene.Net 中做几乎任何事情,因为你编写了执行它的代码)是重音敏感度.我无法使用瑞典语言规则对其进行配置,其中 åäö 应被视为真实字符。启用重音敏感性可以做到这一点,但这也意味着变音符号被解析为真实字符,这意味着ñn 不同。 (想象一下搜索“jalapeno”并没有找到“jalapeño”的匹配项)。禁用重音敏感度基本上会删除所有变音符号,将åäö 变成aao,单词变得完全不同。

在 Lucene.Net(与 SQL Server FTS 相比)中编写内容允许您提供结果突出显示(显示文档中与查询匹配的短语)、搜索相似文档、拼写检查、自定义结果提升、方面、以及其他可以增强用户搜索体验的东西。

【讨论】:

  • 从发布这篇文章开始,我已经使用 Lucene.Net 很长一段时间了,它的任务非常出色 - 并且完全可定制。这篇文章总结了一切,因此给出了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多