SQL 搜索的关键字

jde*_*tor 1 database sql-server search keyword keyword-search

用例

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

问题

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

建议的

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

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

想法/建议/链接?

Pet*_*ron 5

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

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

数据库架构

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

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

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

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

关键词权重

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

我使用整数进行加权,但使用十进制值将提供更多功能,可能排序稍慢。

索引

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

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

查询

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