使用案例

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

问题

我对这些词不太熟悉,但我基本上想做一个关键字来进行 SQL 驱动的搜索。我知道数据库的模式,我也可以对数据库进行数据挖掘。在我尝试实现这一点之前,我想知道目前已经存在的任何方法。我想这个问题是为了解决上述问题什么是好的设计。

建议的

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

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

想法/建议/链接?

有帮助吗?

解决方案

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

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

数据库架构

Keywords table - 每个可能被搜索的单词的加权表(因此,它在某处被引用),每条记录包含以下数据:

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

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

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

关键词权重

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

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

索引

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

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

查询

  1. 完整地获取输入查询搜索字符串并查找直接匹配的关键字。检索内存表中关键字的所有 ProductKeywords 以及关键字权重(与 ProductKeyword 权重不同)。
  2. 删除所有非字母数字字符并将查询拆分为关键字。检索所有现有关键字(只有少数会匹配)。将 ProductKeywords 与关键字权重一起连接到内存表中匹配关键字,该权重与 ProductKeyword 权重不同。
  3. 重复步骤 2,但使用 soundex 值代替,调整权重以降低相关性。
  4. 将检索到的 ProductKeywords 与其相关产品连接起来,并检索每个产品的销售额,这是受欢迎程度的衡量标准。
  5. 按关键字权重、产品关键字权重和销售额对结果进行排序。最终的求和/排序和/或加权取决于您的实现。
  6. 限制结果并将产品搜索结果返回给客户端。

其他提示

您正在寻找的是 自然语言处理. 。奇怪的是这个 用过的 免费包含为 英文查询 在 SQL Server 2000 及更早版本中。但现在已经消失了

其他一些来源是:

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

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

如果您使用 SQL Server,则只需使用它的 全文搜索 功能,专门为解决您的问题而设计。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top