1

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

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

任何人都可以建议此类搜索的最佳做法吗?想到的第一个想法是在数据库中存储同一字段的两个版本,例如:

Description
Description_Search

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

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

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

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

提前致谢!

4

1 回答 1

0

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

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

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

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

于 2012-08-22T18:44:51.223 回答