1

用例

当用户访问我的网站时,他们会遇到一个类似于 SO 的搜索框。他们可以使用计划文本搜索结果。“.net questions”、“closed questions”、“.net and java”等。搜索的功能与 SO 稍有不同,因为它将尽可能多地尝试数据库的架构而不是直接全文搜索。因此,“.net questions”只会搜索 .net 问题,而不是 .net 答案(可能不适用于 SO 案例,这里只是一个示例),“closed questions”将返回已关闭的问题,“.net and java” questions 将返回与 .net 和 java 相关的问题,仅此而已。

问题

我对这些词不太熟悉,但我基本上想为 SQL 驱动的搜索做一个关键字。我知道数据库的架构,我也可以对数据库进行数据挖掘。在我尝试实施之前,我想知道那里已经存在的任何当前方法。我想这个问题是针对所述问题的好的设计。

建议的

到目前为止,我提出的解决方案看起来像这样

  1. 清理输入。只需删除任何特殊字符
  2. 将输入解析为数据块。将“c# java”的输入分解为 c# 和 java 还将“'c#java' questions”等特殊情况处理为“c#java”和“questions”。
  3. 从输入中构建一棵树
  4. 将数据绑定到元数据中。因此,转换诸如封闭问题之类的东西并将其与表格的封闭列相关联。
  5. 将树转换为 sql 查询。

想法/建议/链接?

4

4 回答 4

5

我经营一家数字音乐商店,使用“单一搜索”,根据关键字的出现和产品出现的模式来加权关键字,例如。具有不同的列,例如“艺术家”、“标题”或“出版商”。

产品也与专辑和播放列表相关,但为了解释更简单,我将仅详细说明产品关键字的索引和查询。

数据库模式

Keywordstable - 每个可能被搜索的单词的加权表(因此,它在某处被引用),每个记录的数据如下:

  • 关键字 ID(不是单词),
  • 圣言本身,
  • Word 的 Soundex Alpha 值
  • 重量

ProductKeywords表 - 由产品的任何字段(或列)引用的每个关键字的加权表,每条记录的数据如下:

  • 产品编号,
  • 关键字 ID,
  • 重量

关键字权重

权重值表示单词出现的频率。权重较低的匹配关键字“更独特”,更有可能成为正在搜索的内容。通过这种方式,经常出现的单词会自动“降低权重”,例如。“那个”、“一个”或“我”。但是,最好在索引之前去除那些常见单词的原子出现。

我使用整数进行加权,但使用十进制值将提供更多的通用性,可能会稍微慢一些排序。

索引

每当更新任何产品字段时,例如。艺术家或标题(不经常发生),数据库触发器重新索引产品的关键字,就像在事务中这样:

  1. 如果不再引用,所有产品关键字都将被取消关联并删除。
  2. 每个索引字段(例如艺术家)值都作为关键字存储/检索,并与表中的产品相关,以ProductKeywords进行直接匹配。
  3. 然后,关键字权重会增加一个取决于字段重要性的值。您可以根据字段的重要性添加、减去权重。如果 Artist 比 Title 更重要,则从其ProductKeyword权重调整中减去 1 或 2。
  4. 每个索引字段值都被去除任何非字母数字字符并分成单独的词组,例如。“比利乔尔”变成了“比利”和“乔尔”。
  5. 每个字段值的每个单独的词组都被作为关键字进行检索和存储/检索,并以与步骤 2 相同的方式与产品相关联。如果关键字已经与产品相关联,则简单地调整其权重。

查询

  1. 完整获取输入查询搜索字符串并查找直接匹配的关键字。检索内存表中关键字的所有 ProductKeywords 以及关键字权重(不同于 ProductKeyword 权重)。
  2. 去除所有非字母数字字符并将查询拆分为关键字。检索所有现有的关键字(只有少数会匹配)。将 ProductKeywords 与内存表中匹配的关键字以及关键字权重一起加入,这与 ProductKeyword 权重不同。
  3. 重复第 2 步,但改用 soundex 值,调整权重以降低相关性。
  4. 将检索到的 ProductKeywords 加入到它们的相关产品中,并检索每个产品的销售额,这是流行度的衡量标准。
  5. 按关键字权重、产品关键字权重和销售额对结果进行排序。最终的求和/排序和/或加权取决于您的实现。
  6. 限制结果并将产品搜索结果返回给客户。
于 2010-03-26T12:01:23.463 回答
3

您正在寻找的是自然语言处理。奇怪的是,这曾经在 SQL Server 2000 及更早版本中作为英语查询免费包含在内。但是现在没了

其他一些来源是:

这个概念是一个元数据字典,将单词映射到表、列、关系等和一个英语句子解析器组合在一起,以将一个英语句子(或只是一些关键字)转换为一个真正的查询

有些人甚至使用带有语音识别功能的 English Query 进行一些非常酷的演示,但从未见过它在愤怒中使用过!

于 2010-03-22T21:08:32.780 回答
0

如果您使用的是 SQL Server,您可以简单地使用其专为解决您的问题而设计的全文搜索功能。

于 2010-03-19T00:21:24.240 回答
0

您可以使用混合方法,获取全文搜索结果,并根据您的#4 中的元数据进一步过滤它们。对于更智能的东西,您可以通过跟踪用户在搜索后单击的链接并将该选择与关键搜索词存储在决策树中来创建一个简单的监督学习解决方案。然后将从该决策树中挖掘搜索

于 2010-03-25T04:44:23.563 回答