Sql 从自由格式文本字段提取人名

Sql 从自由格式文本字段提取人名,sql,sql-server-2012,full-text-search,contains,Sql,Sql Server 2012,Full Text Search,Contains,我有一个包含3000万条记录的大表,其中包含一个自由格式的文本字段,该字段可以包含任何位置的名称以及任何称呼,或者根本不称呼 我的工作是用Xxxxx Xxxxx掩盖姓名,以保护隐私 我可以访问一个大型的姓氏数据库,该数据库为我定义了什么是名字 使用SQL Server 2012,我可以使用什么最有效的技术来完成此任务 编辑 好的,我已经做了一些相当不错的工作,包括全文索引/搜索、名称数据库和存储过程 然而,我遇到了一个相当奇怪的问题。我正在使用一个CONTAINS谓词(CONTAINS([tex

我有一个包含3000万条记录的大表,其中包含一个自由格式的文本字段,该字段可以包含任何位置的名称以及任何称呼,或者根本不称呼

我的工作是用Xxxxx Xxxxx掩盖姓名,以保护隐私

我可以访问一个大型的姓氏数据库,该数据库为我定义了什么是名字

使用SQL Server 2012,我可以使用什么最有效的技术来完成此任务

编辑

好的,我已经做了一些相当不错的工作,包括全文索引/搜索、名称数据库和存储过程

然而,我遇到了一个相当奇怪的问题。我正在使用一个CONTAINS谓词(CONTAINS([textvaluefield],@namestring),其中SET@namestring='NEAR((Dr,“+@name+”),1,TRUE)')

除非[textvaluefield]中的称呼语是“DR.”而不是“DR.”,即“DR.Johnson”没有被拾取,而“DR.Johnson”却被拾取。我已经验证了这一点,因为如果我将[textvaluefield]中记录的值从“DR.”更改为“DR.”,但如果其他内容保持不变,则该记录将突然被拾取。如果我将该记录还原为使用“DR.”,则该记录将不会再次被拾取


奇怪的是,我确实使用了不区分大小写的排序规则(Latin1_General_CI_AS)。有人有什么想法吗?

如果您可以验证“stopwords”表中没有任何记录:

我还遇到了一个类似的问题,通过在所需的表和列上创建一个模式绑定视图并使用LOWER函数显式创建一个列,解决了这个问题

CREATE VIEW [User].[UserValues]
WITH
 SCHEMABINDING
AS
SELECT
        [UserId]
      , [UserName]
      , LOWER(Username]) AS [LoweredUsername]
    FROM
        [User].[Values]

不要忘记为全文添加一个唯一的聚集索引。

因此,您有一个自由文本字段和一个名称表,并且您希望从该自由文本字段中删除名称表中的所有实例?如果一个名为smith的用户在其帖子中写道iron smith,您如何确切地知道删除他的名称“smith”,而不是术语“i”罗恩·史密斯(假设你的名单上没有“铁”这个姓氏,那么“铁史密斯”将被完全删除)?这似乎是你得到的任何结果都会有例外。这里希望“the”不是一个同意的姓氏,但我们将进行如下缓解。我们不会实际删除这些名称。我们将用“Xxxxx”来掩盖它们。这当然会将iron smith变成iron Xxxxx-这并没有多大的改进。但之后我们将保留原始文本和字段d更改的文本字段,当我们检测到这样的问题时,我们将修复历史问题并调整前进过程。我知道这并不理想,但隐私因素优先,因为这是医疗记录的字段,我们认为冲突率将很低。“奇怪的是,我确实在使用不区分大小写的排序规则(Latin1_General_CI_AS)。有人有什么想法吗?”——用lower()将所有内容都小写)…或大写,如果您愿意。--在任何情况下保留所有内容都是一个好主意,您不希望因此而丢失数据。是的,我可以尝试强制进行大小写转换,但这就是我提出问题的原因:完全索引搜索应该以任何方式将所有内容转换为小写,并且它使用大量值来实现这一点,但不是使用DR vs DR。这就是问题所在我想解开的谜团!
CREATE VIEW [User].[UserValues]
WITH
 SCHEMABINDING
AS
SELECT
        [UserId]
      , [UserName]
      , LOWER(Username]) AS [LoweredUsername]
    FROM
        [User].[Values]