T-SQL 存储过程返回 google 风格的“建议”搜索结果

2024-02-04

好的,使用 SQL Server 2008。在我的网页上,我有一个连接了 jQuery-UI AutoComplete 的文本框。

现在,我需要一个存储过程来搜索单个表(或我认为的多个连接表)的所有列,以查找来自文本框/自动完成 AJAX 调用的搜索字符串,并返回“建议的”搜索字符串。我正在使用 AdventureWorks 数据库进行测试(产品表)

例如,产品表包含产品名称和产品编号(等等)的列,我想根据用户输入返回建议的搜索字符串,用户可以在其中输入产品名称和/或产品编号。

我让它在一个列上工作,这很简单。有任何想法吗?


我建议全文搜索(MS' 或 Lucene 都可以)下面的代码使用 MSSQL FTS 作为我目前在我的应用程序中使用的内容。

如果尚未安装 FTS 搜索,请安装。如果您检查过该服务正在运行。 在 Management Studio 中运行此命令来设置目录并添加产品表;和颜色/名称/产品编号到目录。

USE [AdventureWorks]
GO
CREATE FULLTEXT CATALOG [ProductsTest]WITH ACCENT_SENSITIVITY = OFF
AUTHORIZATION [dbo]

GO

USE [AdventureWorks]
GO
CREATE FULLTEXT INDEX ON [Production].[Product] KEY INDEX [PK_Product_ProductID] ON ([ProductsTest]) WITH (CHANGE_TRACKING AUTO)
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Color])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Name])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([ProductNumber])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ENABLE
GO

然后,您可以立即对所有列运行查询;例如银色(根据颜色和名称选择)

Select * from production.product where
contains(*, '"Silver*"')

查询中的*将找到Silver*,因此您可以在用户输入时使用它来构建结果。需要考虑的一件事是谷歌使这项工作实时进行 - 如果您正在搜索大量数据,您将能够在不中断用户打字的情况下取回数据。我认为通常人们通过从他们要查找的第一个字母开始输入来使用这些搜索 - 我承认会有拼写错误 - 你可以在他们按下的每个空格之后实施拼写检查器也许可以处理这个问题。或者存储运行的搜索并查看拼写错误并更改代码以基于映射(或在 FTS 中使用自定义同义词库来处理该错误)。

对于任何企业来说,排名都将是一个有趣的发展问题;您是否正在查找 Mountain Frame 的第一个结果 - 或者您想按销售额或价格对它们进行加权?如果用户输入多个文本术语,您可以使用 FTS 根据搜索字符串生成排名。

select aa.rank, bb.* 
From containstable(production.product, *, '"Mountain" and "Silver*"') aa
inner join production.product bb
on aa.[key] = bb.productid
order by rank desc

这将返回 30 行;并根据用户输入的文本的权重来确定第一名记录。在任何一种情况下,您可能都希望添加编码排名来调整结果以满足您的业务需求 - 对价格最高的小部件 1 进行排名可能不是这样。这就是为什么您要存储人们搜索/点击的内容,以便您稍后可以分析结果。

有一个非常好的语言解析器 http://www.sqlservercentral.com/articles/Full-Text+Search+%282008%29/64248/用于 .Net,将输入的 google 样式字符串查询转换为 FTS 支持的语言,从而使您熟悉使用您网站的任何布尔搜索。

您可能还想添加一些群体智慧功能,通过审核用户输入的内容并最终访问并使用成功地图来更改最终建议,使其真正与用户相关。

作为最后的建议,如果这是一个商业网站,您可能想看看Easyask http://www.easyask.com这是一个可怕的、伟大的自然语言处理器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

T-SQL 存储过程返回 google 风格的“建议”搜索结果 的相关文章

  • 为什么使用 SQL Server 2008 地理数据类型?

    我正在重新设计客户数据库 我想要与标准地址字段 街道 城市等 一起存储的新信息之一是地址的地理位置 我想到的唯一用例是 当无法找到地址时 允许用户在 Google 地图上绘制坐标 这种情况通常发生在该地区是新开发的或位于偏远 农村地区时 我
  • 按空值和非空值分组

    我有一个包含用户 facebook ID 的表 我必须报告谁在使用 facebook 或不使用 对于 facebook 用户 数据行包含一个数字 否则包含 null 我的结果必须是这样的 NbUsers Facebook 1000 no 5
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

    所以我有一个 DB2 生产数据库 我需要在其中使用可用的函数 ListAgg 我希望使用 H2 的单元测试能够正确测试此功能 不幸的是H2不直接支持ListAgg 但是 我可以创建一个用户定义的聚合函数 import java sql Co
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • 同时从2个表中删除?

    我正在使用 asp net 和 sql 服务器 我有 2 个表 类别和产品 在产品表中 我的categoryId 为FK 我想要做的是 当我从类别表中删除类别时 我希望该类别中的所有产品都将在产品表中删除 如何才能做到这一点 我更喜欢使用存
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • SQL Server 数据库架构版本控制和更新

    对于我的应用程序 我必须支持更新方案 并且数据库可能会受到影响 我希望能够从旧版本更新到最新版本 而无需安装中间版本 例如 假设我有版本 A 最旧的版本 B 中间版本 和 C 新版本 我希望能够将版本 A 直接更新到版本 C 对于应用程序文
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 我可以从 SQL Server 读取元数据来了解最后更改的行/表吗?

    我们有一个数据库hundreds的桌子 有没有某种metaSQL Server 中的数据源 我可以以编程方式查询以获取名称最后更改表和行 或者我们是否需要实施这个我们自己每个表中的字段称为上次更改日期时间 etc 就查明表最后一次修改的时间
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q

随机推荐