SQL Server 加权全文搜索

2024-04-05

目前,我有一个表,可以在 4 个字段(名字、姓氏、中间名和别名)上搜索。我目前有一个包含稳定搜索行并且它有效。不太好,但它有效。现在我想让名字的权重更高,中间名的权重更低。

我找到了命令ISABOUT但如果我必须通过文字而不是专栏来完成它,那似乎毫无价值(希望我理解错误)。如果按单词输入,则这不是一个选项,因为我不知道用户将输入多少单词。

我找到了线索here https://stackoverflow.com/questions/198152/how-do-i-assign-weights-to-different-columns-in-a-full-text-search谈到了同样的解决方案,但是我无法让接受的解决方案发挥作用。也许我做错了什么,但无论如何我都无法让它工作,而且它的逻辑看起来真的……很奇怪。必须有一种更简单的方法。


操纵排名的关键是使用联合体。对于每一列,您使用单独的 select 语句。在该语句中,添加一个标识符,显示每行是从哪一列中提取的。将结果插入表变量中,然后您可以通过对标识符进行排序或将排名乘以基于标识符的某个值来操纵排名。

关键是给出修改排名的外观,而不是实际改变sql server的排名。

使用表变量的示例:

DECLARE @Results TABLE (PersonId Int, Rank Int, Source Int)

对于有列的表 PeoplePersonId Int PK Identity, FirstName VarChar(100), MiddleName VarChar(100), LastName VarChar(100), AlsoKnown VarChar(100)将每一列添加到全文目录后,您可以使用以下查询:

INSERT INTO @Results (PersonId, Rank, Source)

SELECT PersonId, Rank, 1
FROM ContainsTable(People, FirstName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId

UNION
SELECT PersonId, Rank, 2
FROM ContainsTable(People, MiddleName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId

UNION
SELECT PersonId, Rank, 3
FROM ContainsTable(People, LastName, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId

UNION
SELECT PersonId, Rank, 4
FROM ContainsTable(People, AlsoKnown, @SearchValue) CT INNER JOIN People P ON CT.Key = P.PersonId

/*
Now that the results from above are in the @Results table, you can manipulate the
rankings in one of several ways, the simplest is to pull the results ordered first by Source then by Rank.  Of course you would probably join to the People table to pull the name fields.
*/

SELECT PersonId
FROM @Results
ORDER BY Source, Rank DESC

/*
A more complex manipulation would use a statement to multiply the ranking 
by a value above 1 (to increase rank) or less than 1 (to lower rank), then 
return results based on the new rank.  This provides more fine tuning, 
since I could make first name 10% higher and middle name 15% lower and 
leave last name and also known the original value.
*/

SELECT PersonId, CASE Source WHEN 1 THEN Rank * 1.1 WHEN 2 THEN Rank * .9 ELSE Rank END AS NewRank FROM @Results
ORDER BY NewRank DESC

一个缺点是你会注意到我没有使用UNION ALL,因此如果一个单词出现在多个列中,则排名不会反映这一点。如果这是你可以使用的问题UNION ALL然后通过将全部或部分重复记录排名添加到具有相同人员 ID 的另一个记录的排名来删除重复的人员 ID。

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

SQL Server 加权全文搜索 的相关文章

  • 验证 C# 中的小数是否存储在 SQL Server 中

    我有一个十进制数据库列decimal 26 6 据我所知 这意味着精度为 26 小数位数为 6 我认为这意味着该数字的长度总共可以是 26 位数字 其中小数点后可以有 6 位数字 在我的 WPF C 前端中 我需要验证传入的小数 以便我可以
  • 将计算列设置为非空时遇到问题

    我在将计算列设置为时遇到问题not null 我想要实现的是C001 C002 等 同时将其设置为not null 我在论坛上读到 这可以通过使用 NULL 值的默认值 0 来实现 E g ISNULL Price Taxes 0 我尝试应
  • 如何查找 SQL Server 数据库中所有空间的使用情况

    我们有一个 SQL Server 数据库 根据 Microsoft SQL Server Management Studio 的数据 该数据库只有 6436Mb 中的 119Mb 可用 然而命令 EXEC sp msforeachtable
  • 数据库函数 VS Case 语句

    昨天我们遇到了一个场景 必须获取 a 的类型db field在此基础上我们必须编写该字段的描述 喜欢 Select Case DB Type When I Then Intermediate When P Then Pending Else
  • 为列名创建动态选择获取值 - 在 SQL Server 中

    请帮助我创建一个选择 SQL 语句 其中的结果列名称是从原始表中的列值获取的 表名是Device Part 用户可以输入很多DeviceCode其中有许多动态PartTypeName PartTypeName 值为PartInfo 这可能有
  • 如何返回以列名作为第一行的 T-SQL 查询

    我正在编写一个 SSIS 包来将数据从 SQL Server 2012 数据库输出到 CSV为客户归档 要求是第一行是列名称 下面是我为数据流任务中的源编写的查询 问题是 它总是将列名返回为最后一行 而不是第一行 为什么 我该如何实现这一目
  • 带附件的数据库电子邮件(excel 文件/pdf 文件)?

    我必须从数据库向我的邮件 ID 发送一封带有附件的邮件 EXEC msdb dbo sp send dbmail profile name Adventure Works Administrator recipients email pro
  • 区分大小写变得疯狂

    我有一个数据库 我正在尝试执行以下查询 SELECT COUNT FROM Resource WHERE Name LIKE ChinaApp SELECT COUNT FROM Resource WHERE Name LIKE China
  • 触发器以捕获服务器中的架构更改

    是否可以实现类似以下触发器的东西 CREATE TRIGGER tr AU ddl All Server ON DATABASE WITH EXECUTE AS self FOR DDL DATABASE LEVEL EVENTS AS D
  • 如何使用 Ansible when 条件在文件中搜索字符串

    我有一个变量中用 n 分隔的搜索字符串列表listofips 我想在文件中搜索该字符串hello csv在我的下面playbook dir 我可能遇到一些语法问题 我不确定 但下面是我尝试过的 set fact listofips 10 0
  • 如何在 where 子句中使用别名? [复制]

    这个问题在这里已经有答案了 可能的重复 在 WHERE 子句中引用列别名 https stackoverflow com questions 8370114 referring to a column alias in a where cl
  • SQL:列出多个连接语句中的重复记录?

    你好 以下查询在连接多个表后返回所有员工 select e from dbo EMP e join dbo HREMP a on a ID e ID join dbo LOGO c on c EMPID e id join dbo LOGO
  • 将 Python 中创建的 pandas 数据框插入 SQL Server

    如前所述 我在 Python 中创建了一个数据集合 40k 行 5 列 我想将其插入 SQL Server 表中 通常 在 SQL 中我会做一个 select into myTable from dataTable 调用来执行插入 但是 p
  • 如何授予用户访问 SQL Server 中的 sys.master_files 的权限?

    我需要授予数据库用户读取权限sys master files桌子 我怎样才能做到这一点 目前用户拥有以下权限 Calling SELECT on sys master files返回空结果 我还使用以下命令测试了相同的查询sa用户按预期工作
  • 使用 SQL Server 作为具有多个客户端的数据库队列

    给定一个充当队列的表 如何最好地配置表 查询 以便多个客户端同时处理队列 例如 下表指示了工作人员必须处理的命令 当worker完成后 它会将处理后的值设置为true ID COMMAND PROCESSED 1 true 2 false
  • SQL分组和总结

    我的表如下所示 income date productid invoiceid customerid 300 2015 01 01 A 1234551 1 300 2016 01 02 A 1234552 1 300 2016 01 03
  • 在 SQL Server 中选择条件的值[重复]

    这个问题在这里已经有答案了 在查询选择中 我想显示字段是否满足条件的结果 想象一下我有一张名为stock 该表有一列告诉我库存中每种商品的数量 我想做的是这样的 SELECT stock name IF stock quantity lt
  • 当列的数据类型为 int 时,如何用字符串替换 null

    我有一个包含 3 列的表和如下示例数据 所有列都是数据类型int 我有这个查询 select foodid dayid from Schedule 我要更换dayid用字符串 ifdayid null 为此我尝试了这个查询 select f
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • VBA仅清除数据透视表缓存,但保留数据透视表结构

    如何使用VBA清除数据透视表缓存 但不破坏数据透视表结构 我的数据透视表已连接到外部数据源 SQL 源决定哪个用户应该查看数据的哪一部分 当表刷新时 源会填充该表 我想保存 Excel 文件并使用干净的数据透视表 内部没有数据 分发它 结果

随机推荐

  • 分裂长长

    如何 拆分 即 long long 类型 以便它的第一部分位于 long 类型的 var 中 第二部分也位于 long 类型的 var 中 long long long type 0xaaaabbbbccccdddd 在第一个 int 中
  • textarea、tinyMCE 并在 textarea 中插入图像

    我想用 jquery 在文本区域中插入图像 我知道 img 标签无法插入到文本区域中 我正在使用tinymce img src image jpg class po
  • 如何仅导入子模块而不执行包中的 exec __init__.py

    当从包中导入子模块时 包文件夹中的 init py 文件将首先被执行 如何禁用它 有时我只需要一个包中的一个函数 导入整个包有点繁重 例如pandas io clipboard模块不依赖于 pandas 中的任何其他函数 from pand
  • iPhone 上的 CoreData 支持 IN 谓词吗?

    我正在尝试根据用户定义的类型列表来获取某种类型的一堆记录 fetchRequest setEntity NSEntityDescription entityForName myRecord inManagedObjectContext se
  • 如何在 Genymotion 虚拟设备上安装 Google 框架(Play、帐户等)? [复制]

    这个问题在这里已经有答案了 我目前正在尝试 Genymotion 天哪 它比 ADT 模拟器快得多 但我需要安装 Google Play 才能下载一些应用程序 我该怎么做呢 2017 年 5 月 28 日更新 据我所知 我不再支持此方法 并
  • MySQL 到 Oracle 语法错误(限制/偏移/更新)

    我有一个适用于我当前的 MySQL 数据库的 MySQL 查询 我被迫转向 Oracle 因此我尝试移植所有存储过程 程序以使用 Oracle SQL 语法 我在一个特定查询上遇到了很多麻烦 这是 MySQL 查询 它使用子查询更新表 up
  • 如何使用 Pandas 从 Excel 读取某些列 - Python

    我正在读取 Excel 工作表 并且想要读取某些列 第 0 列 因为它是行索引 和第 22 37 列 现在这就是我所做的 import pandas as pd import numpy as np file loc path xlsx d
  • 传单通过图层选择添加/删除图例

    我是 Leaflet JavaScript 的新手 并且一直在努力让图例仅在从图层控件中选择特定图层时才显示地图 我有三层 其中一层我希望没有图例 另外两层有相应的图例 我遇到了一个例子 但未能使其工作 Add and remove leg
  • 仅在某些 Android 设备上抛出 java.net.SocketTimeoutException

    我正在尝试从 Android 设备上传 JPEG 图像文件 我正在使用square okhttp用于创建请求的库 我在联想 Yoga 平板电脑上遇到这个问题 当我尝试上传图像时 出现以下异常 但当我在 Samsung Galaxy Tab
  • 更改 TensorBoard 中的图像滑块步骤

    TensorBoard 1 1 0 的图像历史 我想更精确地设置滑块的位置 在带有 7 的黑色图像顶部 以便能够选择任何步骤 现在我只能选择例如在步骤2050或2810之间 这可能吗 也许源代码中的某个位置对 10 常数进行了硬编码 我在那
  • php 邮件功能无法使用

    当我尝试在本地主机上使用 php 邮件功能发送邮件时 出现以下错误 可能是什么问题 我什至尝试更改 php ini 文件并给 smtp 主机值提供我的服务提供商值及其仍在努力工作 警告 mail function mail 无法连接到 lo
  • 使用滑动窗口函数处理向量的 MATLAB 函数,返回向量响应矩阵

    假设向量v尺寸的1 x n和功能fun接受一个长度向量L并返回一个大小向量p x 1 是否有一个 MATLAB 函数可以接受向量v 处理每个长度的滑动窗口L使用函数 fun 并返回大小的矩阵p x n or p x n L 我知道这可以通过
  • 对 JSON 编码的字段使用 MySQL LIKE 运算符

    我一直在尝试使用此查询获取表行 SELECT FROM table WHERE field LIKE u0435 u0442 u043e u0442 字段本身 Field u0435 u0442 u043e u0442 u0442 u043
  • 如何创建具有包结构的jar文件?

    我有一个文件夹结构 com cdy ws a class files com cdy ws b class files com cdy ws c class files 当我运行以下命令 jar cvf asd jar class 时 它会
  • abort() 不是 VS2010 中的 __declspec(noreturn)

    在我的 VS2010 副本中 stdlib h 包含 第 353 355 行 CRTIMP declspec noreturn void cdecl exit In int Code CRTIMP declspec noreturn voi
  • 如何撤消 Angular 2 Cli ng-eject?

    我刚刚执行了ng eject命令 但现在我需要恢复它 并继续使用ng命令 是否可以 我将不胜感激任何帮助 At https github com angular angular cli blob master packages 40angu
  • 如何获取给定字体文件的字体系列的名称?

    我有一组文件名不可预测的字体文件 因此我无法从文件名中推断出真正的 字体系列 名称 因此 我需要读取字体元数据以提取真正的 字体系列 名称 以便渲染此字体文件 我使用的是 C NET 4 0 WinForms 我见过这个功能GetFontI
  • 如何将日期选择器最大日期限制为今天? [复制]

    这个问题在这里已经有答案了 问题就在标题里 我有两个日期选择器 从和到 我想将日期选择器限制为当前日期 我怎么做 提前致谢 使用 maxDate 选项 http jqueryui com demos datepicker option ma
  • 如何处理 Web API 中的可选查询字符串参数

    我正在编写一个 Web API 我希望了解处理可选查询字符串参数的最佳方法是什么 我有一个定义如下的方法 HttpPost public HttpResponseMessage ResetPassword User user var que
  • SQL Server 加权全文搜索

    目前 我有一个表 可以在 4 个字段 名字 姓氏 中间名和别名 上搜索 我目前有一个包含稳定搜索行并且它有效 不太好 但它有效 现在我想让名字的权重更高 中间名的权重更低 我找到了命令ISABOUT但如果我必须通过文字而不是专栏来完成它 那