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

时间:2014-08-05 23:37:32

标签: sql sql-server-2012 full-text-search contains

我有一个包含3000万条记录的大型表格,其中包含一个自由格式的文本字段,其中可能包含任何位置的姓名,并且可以任何称呼,或者根本没有称呼。

我的工作是用Xxxxx Xxxxx屏蔽名称以保护隐私。

我可以访问一个大型姓氏数据库,为我定义名称的构成。

使用SQL Server 2012,我可以用于此任务的最有效技术是什么?

修改

好的,我的工作非常不错,包括全文索引/搜索,名称数据库和存储过程。

但是,我遇到了一个相当特殊的问题。我使用CONTAINS谓词(CONTAINS([textvaluefield],@ namestring),其中SET @namestring =' NEAR((博士,' + @ name +'),1,是的,'。

这完全有效,除非[textvaluefield]中的称呼是" DR。"而不是" Dr。",即" DR。约翰逊"并没有被提起,但是#34;博士。约翰逊"是。我已经验证了这一点,因为如果我更改了记录的[textvaluefield]中的值,那么" DR。"对于#34; Dr。"但是其他一切都保持不变,那个记录会突然被捡起来。如果我将记录恢复为使用" DR。",它将不会再次被接收。

这让我很奇怪的是,我肯定使用不区分大小写的排序规则(Latin1_General_CI_AS)。有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您可以确认“停用词”表中没有任何记录:

SELECT * FROM sys.[fulltext_system_stopwords] AS FSS WHERE [stopword] LIKE 'Dr_'
SELECT * FROM sys.[fulltext_stopwords] AS FS

我也遇到过类似的问题,并通过在所需的表和列上创建架构绑定视图并使用LOWER函数显式创建列来解决它。

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

不要忘记为要使用的全文添加唯一的聚簇索引。