首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sys.dm_fts_parser sql全文

sys.dm_fts_parser sql全文
EN

Stack Overflow用户
提问于 2013-06-04 12:10:45
回答 4查看 3.8K关注 0票数 2

我们很难弄清楚给sys.dm_fts_parser的两个相似的字符串会产生不同的结果

代码语言:javascript
复制
select * from sys.dm_fts_parser('"0 CAD"', 0, null, 0) 

似乎认为"0 CAD“是一个令牌(返回2个令牌)

代码语言:javascript
复制
select * from sys.dm_fts_parser('"0 cad"', 0, null, 0) 

返回3个令牌-正确

更重要也更令人困惑的是为什么

select * from Table where contains(*,"point 5 CAD")工作正常,但select * from Table where contains(*,"point 5 cad")失败

其中搜索的列包含"point 5 CAD“-

全文索引构建器是否应该忽略基于索引设置的干扰词(例如"5")或将其包括在内。

我们尝试过这两种方法,但无法解释为什么"nnnn CAD“是特殊的

请注意,根据http://msdn.microsoft.com/en-us/library/ms142583.aspx,全文应该不区分大小写

我遗漏了什么?

编辑:使用SQL 2012 11.0.2218

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-23 08:05:21

使用SQL2008时的

代码语言:javascript
复制
select * from sys.dm_fts_parser('"0 CAD"', 0, null, 0) - gives 2 tokens   
select * from sys.dm_fts_parser('"0 CAD"', 1033, null, 0) - gives 3 tokens   

SQL2012上的 (11.0.3218):

代码语言:javascript
复制
select * from sys.dm_fts_parser('"0 CAD"', 1033, null, 0) - gives 2 tokens

在SQL2012中,微软引入了一个新的断字符(版本14.0.4763.1000) http://msdn.microsoft.com/en-us/library/gg509108.aspx

看起来破碎机现在可以识别3个字符的ISO 4217货币代码,如果在3个字符代码之前有一个数字,它就不会被分解。

票数 1
EN

Stack Overflow用户

发布于 2014-02-13 07:23:32

我的团队也遇到了这种奇怪的标记化行为。我们的解决方法是将LOWER应用于查询和搜索文本。

作为Haroon previously identified,这个问题似乎是由于记号赋予器识别数字附近的某些大写货币代码并对它们进行不同处理而引起的。下面的查询说明了这一点:

代码语言:javascript
复制
SELECT * FROM sys.dm_fts_parser ('"syp 123"', 1033, 0, 0) -- Works fine
SELECT * FROM sys.dm_fts_parser ('"SYP 123"', 1033, 0, 0) -- Doesn't work

我们编写了一个脚本,该脚本标识了表现此行为的所有1-4个字母的字符组合:

代码语言:javascript
复制
DECLARE @CurrencyCodes TABLE (CurrencyCode varchar(4), TokenCount int)
DECLARE @Start int = 65 -- A
DECLARE @End int = 90 -- Z

DECLARE @A int, @B int, @C int, @D int

SET @A = @Start
WHILE NOT (@A > @End) BEGIN
    INSERT INTO @CurrencyCodes VALUES (CHAR(@A), NULL)
    SET @B = @Start
    WHILE NOT (@B > @End) BEGIN
        INSERT INTO @CurrencyCodes VALUES (CHAR(@A) + CHAR(@B), NULL)
        SET @C = @Start
        WHILE NOT (@C > @End) BEGIN
            INSERT INTO @CurrencyCodes VALUES (CHAR(@A) + CHAR(@B) + CHAR(@C), NULL)
                SET @D = @Start
                WHILE NOT (@D > @End) BEGIN
                    INSERT INTO @CurrencyCodes VALUES (CHAR(@A) + CHAR(@B) + CHAR(@C) + CHAR(@D), NULL)
                    SET @D = @D + 1
                END
            SET @C = @C + 1
        END
        SET @B = @B + 1
    END
    SET @A = @A + 1
END

UPDATE @CurrencyCodes SET TokenCount = (SELECT COUNT(1) FROM sys.dm_fts_parser ('"' + CurrencyCode + '123,456"', 1033, 0, 0))

SELECT CurrencyCode FROM @CurrencyCodes WHERE TokenCount = 2

通过该查询,我们发现以下273个代码中的任何一个都会出现问题:

代码语言:javascript
复制
ADF ADP AED AFA AFN ALK ALL AMD ANG AOA AON AOR ARA ARL ARM ARP ARS ATS AUD AWG AZM AZN BAM BBD BDT BEC BEF BEL BGJ BGK BGL BGN BHD BIF BMD BND BOB BOP BOV BRB BRC BRE BRL BRN BRR BRZ BSD BTN BWP BYR BZD CAD CDF CFP CHE CHF CHW CLF CLP CNX CNY COP COU CRC CSD CSJ CSK CUP CVE CYP CZK DDM DEM DJF DKK DM DOP DZD ECS ECV EEK EGP EQE ERN ESA ESB ESP ETB EUR EURO FF FIM FJD FKP FRF GBP GEL GHC GHS GIP GMD GNE GNF GRD GTQ GWP GYD HKD HNL HRK HTG HUF IDR IEP ILP ILR ILS INR IQD IRR ISJ ISK ITL JMD JOD JPY KES KGS KHR KMF KPW KRW KWD KYD KZT LAJ LAK LBP LKR LRD LSL LTL LUF LVL LYD MAD MAF MCF MDL MGA MGF MKD MKN MMK MNT MOP MRO MTL MUR MVQ MVR MWK MXN MXP MXV MYR MZM MZN NAD NGN NIO NLG NOK NPR NZD OMR PAB PEH PEI PEN PGK PHP PKR PLN PLZ PTE PYG QAR ROL RON RSD RUB RUR RWF SAR SBD SCR SDD SDG SEK SGD SHP SIT SKK SLL SML SOS SRD SRG STD SUR SVC SYP SZL THB TJR TJS TMM TND TOP TPE TRL TRY TTD TWD TZS UAH UAK UGS UGX USD USN USS UYI UYN UYU UZS VAL VEB VEF VNC VND VUV WST XAF XAG XAU XBA XBB XBC XBD XCD XDR XEC XEU XFO XFU XOF XPD XPF XPT XTS YDD YER YUD YUM ZAL ZAR ZMK ZRN ZRZ ZWC ZWD
票数 3
EN

Stack Overflow用户

发布于 2013-06-04 16:10:36

您必须使用正确的断字符的区域设置标识符(Lcid)。因此,需要将第二个参数替换为1033

代码语言:javascript
复制
SELECT * 
FROM sys.dm_fts_parser('"0 CAD"', 1033, null, 0)

返回3个标记

代码语言:javascript
复制
SELECT * 
FROM sys.dm_fts_parser('"0 cad"', 1033, null, 0)

返回3个标记

还需要选择英语作为每个列的分词语言。

代码语言:javascript
复制
USE [YourDB]
GO
ALTER FULLTEXT INDEX ON [dbo].[YourTable] DROP ([YourColumn]) 
GO
USE [YourDB]
GO
ALTER FULLTEXT INDEX ON [dbo].[YourTable] ADD ([YourColumn] LANGUAGE [English])
GO
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16909669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档