sql-server – SQL搜索的关键字

前端之家收集整理的这篇文章主要介绍了sql-server – SQL搜索的关键字前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
用例

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

问题

我对这些单词不太熟悉,但我基本上想要为sql驱动的搜索做一个关键字.我知道数据库的模式,我也可以数据库.我想知道在我尝试实现之前已经存在的任何当前方法.我想这个问题是针对所述问题的优秀设计.

建议

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

>清洁输入.只需删除任何特殊字符
>将输入解析为数据块.将“c#java”的输入分解为c#和java还将“c#java”问题中的特殊情况处理为“c#java”和“问题”.
>根据输入构建树
>将数据绑定到元数据中.因此,转换封闭问题等内容并将其与表格的isclosed列相关联.
>将树转换为SQL查询.

思考/建议/链接

解决方法

我运行一个带有“单一搜索”的数字音乐商店,根据其出现次数和产品出现的架构对关键字进行加权,例如.使用不同的列,如“艺术家”,“标题”或“发布者”.

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

数据库架构

关键字table – 每个可能被搜索的单词的加权表(因此,它被引用到某处),每个记录包含以下数据:

>关键字ID(不是单词),
>这个词本身,
> Word的Soundex Alpha值
>重量

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

>产品ID,
>关键字ID,
>重量

关键字加权

加权值表示单词出现的频率.匹配较低权重的关键字“更独特”,更有可能成为搜索内容.以这种方式,经常出现的单词被自动“降低权重”,例如. “the”,“a”或“I”.但是,最好在索引之前去掉那些常见单词的原子事件.

我使用整数进行加权,但使用小数值将提供更多功能,可能会稍微减慢排序.

索引

每当更新任何产品字段时,例如.艺术家或标题(通常不会发生),数据库触发器在事务内重新索引产品的关键字:

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

查询

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

猜你在找的MsSQL相关文章