Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据库中基于文本搜索的最佳实践_C#_Database_Search_Lucene.net_Porter Stemmer - Fatal编程技术网

C# 数据库中基于文本搜索的最佳实践

C# 数据库中基于文本搜索的最佳实践,c#,database,search,lucene.net,porter-stemmer,C#,Database,Search,Lucene.net,Porter Stemmer,我有一个应用程序,我需要搜索各种基于文本的字段。该应用程序是使用NHibernate作为ORM开发的 我希望在搜索中实现Porter词干分析,以便能够返回相关结果,即使关键字与类似的单词匹配,例如,产品描述包含内存,而搜索关键字为内存 有人能为这类搜索推荐最佳实践吗?首先想到的是在数据库中存储同一字段的两个版本,例如: Description Description_Search Description列是网站管理员输入的文本,是前端可见的文本 Description\u Search将包含相

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

我希望在搜索中实现Porter词干分析,以便能够返回相关结果,即使关键字与类似的单词匹配,例如,产品描述包含
内存
,而搜索关键字为
内存

有人能为这类搜索推荐最佳实践吗?首先想到的是在数据库中存储同一字段的两个版本,例如:

Description
Description_Search
Description
列是网站管理员输入的文本,是前端可见的文本

Description\u Search
将包含相同的文本,但通过波特词干算法传递。然后,搜索查询将基于
Description\u Search
字段,而不是
Description

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

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


提前谢谢

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

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

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


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

一些RDBMS产品提供了一些功能,以方便搜索,而无需您做很多额外的工作。我想到了SQLServer的全文搜索,但还有其他的。如果它极大地提高了性能,那么复制数据并不是浪费。事实上,这和索引是一样的。Lucene看起来很简单:从发布这篇文章的时候起,我已经使用Lucene.Net很长时间了,它的任务非常出色,而且完全可以定制。这篇文章总结了这一切,从而得出了答案。