C# 实施全文搜索表单的文章和建议

C# 实施全文搜索表单的文章和建议,c#,full-text-search,C#,Full Text Search,我需要用C语言创建一个电子邮件/支持票证数据库的全文搜索表单,我正在寻找关于如何实现这一点的建议和文章。我特别想知道如何解决经典的全文搜索问题,例如: 确保匹配是合理的,例如,如果有人输入了big head并且文档包含big hairy head,请确保在搜索中返回该文档。 按相关性对结果排序。 如何下注显示匹配项,例如突出显示匹配项 我知道全文搜索本身就是一个相当庞大的主题领域,我只是想找一些简单的文章和建议,告诉大家如何创建一些至少有点有用和可用的东西 我以前使用过Lucene.Net之类的

我需要用C语言创建一个电子邮件/支持票证数据库的全文搜索表单,我正在寻找关于如何实现这一点的建议和文章。我特别想知道如何解决经典的全文搜索问题,例如:

确保匹配是合理的,例如,如果有人输入了big head并且文档包含big hairy head,请确保在搜索中返回该文档。 按相关性对结果排序。 如何下注显示匹配项,例如突出显示匹配项 我知道全文搜索本身就是一个相当庞大的主题领域,我只是想找一些简单的文章和建议,告诉大家如何创建一些至少有点有用和可用的东西

我以前使用过Lucene.Net之类的东西——显然需要某种全文索引——挑战在于获取Lucene返回的文档列表,并以一种有用的方式呈现它

更新:我想稍微澄清一下我的意思-有数百种通用全文搜索表单,它们都执行非常类似的功能,例如:

每个互联网论坛上的搜索按钮 每个wiki上的搜索按钮 Windows/google桌面搜索 谷歌 每个搜索都从不同的来源获取信息,并使用不同的方式显示它们html、Windows窗体等。。。但每一种方法都用各种复杂的方法解决了相同的问题,而且在大多数情况下,除了桌面搜索之外,输入数据的格式都是相同的:Html或文本

我正在寻找建议和共同的策略,如何做的事情,如排名搜索结果的方式,可能是有用的用户

或者,我曾经考虑过的一种策略是使用一些wiki软件,将我的整个数据集作为文本导出到该wiki中,然后使用wiki进行搜索——我所追求的那种搜索在所有意图和目的上都与已经存在的99%的搜索功能相同,我只想给它一个不同的输入数据源,并对输出进行稍微不同的格式化,这两个我已经知道怎么做了


当然,对于如何进行这些类型的搜索,一定有一些建议?

您的主题是一个特定于数据库的问题。您需要指定要使用的数据库。您可以将搜索关键字提供给数据库引擎,而不是通过程序进行搜索。

SQL Server(包括Express版本)都有一个功能。这可以在列中搜索文本,但也可以利用iFilter在嵌入文档中搜索。您可以使用T-SQL中的命令在内容内智能搜索并按排名顺序返回:

返回由零、一或多个元素组成的表 包含以下内容的列的行 值的基于字符的数据类型 这与意思相符,但与事实不符 中文本的确切措辞 指定的自由文本\u字符串。 FREETEXTTABLE只能被引用 在SELECT的FROM子句中 语句类似于常规表名

使用FREETEXTTABLE的查询指定 freetext类型的全文查询 返回相关性排名值 的秩和全文键 每行

例如


有关更多信息,请阅读。

您可以使用apache提供的强大库,扩展也可以简化您的工作

还可以查看CONTAINSTABLE,因为它支持通配符和权重等


如果你不想去SQL根,那么也要考虑它是免费的,强大的,看起来很容易使用。它符合您的所有要求,并自动处理排名等问题。

只有您和您的利益相关者才能确定构成“合理”结果的内容。同样的相关性,最后,如何最好地显示结果是。。。你猜对了。。。最好由您和您的利益相关者来定义。是的,但在某一点上,大多数人都会99%同意什么是明智的,什么是不明智的。它只会是一个快速的内部搜索工具,只要大多数人认为它是明智的,那对我来说就足够好了。全文搜索必须是一个相当常见的要求-我不想花费大量的时间做一些花哨的和特定的数据,当我可以掐别人,让它是%80一样好。这看起来不错,但它有两个问题-1它没有正确索引html-搜索html,br span等。。。返回数以百万计的无用结果,而不仅仅是返回呈现的html包含“html”“br”“span”等的结果。此外,权重/排名的工作方式看起来很难处理-如果我输入一个类似html boolean WebRequest的搜索,那么让它对所有3个出现在一起的结果进行排名要比只出现1个的结果更难处理,或者结果,所有3个都显示在一个大文档中。这就是我最终使用的-这比我想象的要少,但是 也更灵活。
SELECT FT_TBL.CategoryName 
    ,FT_TBL.Description
    ,KEY_TBL.RANK
FROM dbo.Categories AS FT_TBL 
    INNER JOIN FREETEXTTABLE(dbo.Categories, Description, 
        'sweetest candy bread and dry meat') AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY];