none
SQL Server 2012 Full-Text特定字串無法正確SELECT RRS feed

  • 問題

  • Dear everybody,

    我在測試SQL Server 2012上的FULL-TEXT功能時
    發現在某些字串組合下似乎就會有問題
    例如以下的sample, 就一個 "李元生" 無法被正確的SELECT出來
    其他像是 "林元生" 或是 "李生元" 都是正常的.

    不知這樣的狀況, 應該如何排除?

    /**********
    CREATE DATABASE fulltext_test;
    GO
    USE fulltext_test;
    GO
    CREATE TABLE mytable (c1 int, c2 nvarchar(100) not null);
    GO
    CREATE UNIQUE INDEX uni_mytable ON mytable(c2);
    CREATE FULLTEXT CATALOG ft AS DEFAULT;
    CREATE FULLTEXT INDEX ON mytable(c2) 
       KEY INDEX uni_mytable
       WITH STOPLIST = SYSTEM;
    GO

    INSERT INTO mytable VALUES
    (1,'李元生'),
    (2,'李元生先生'),
    (3,'李元生先生陳情'),
    (4,'李元生先生陳情事'),
    (5,'林元生'),
    (6,'林元生先生'),
    (7,'林元生先生陳情'),
    (8,'林元生先生陳情事'),
    (9,'李生元'),
    (10,'李生元先生'),
    (11,'李生元先生陳情'),
    (12,'李生元先生陳情事'),
    (13,'李元志'),
    (14,'李元志先生'),
    (15,'李元志先生陳情'),
    (16,'李元志先生陳情事'),
    (17,'李圓生'),
    (18,'李圓生先生'),
    (19,'李圓生先生陳情'),
    (20,'李圓生先生陳情事')

    SELECT * FROM mytable WHERE CONTAINS(c2,'李元生')
    SELECT * FROM mytable WHERE CONTAINS(c2,'林元生')
    SELECT * FROM mytable WHERE CONTAINS(c2,'李生元')
    SELECT * FROM mytable WHERE CONTAINS(c2,'李元志')
    SELECT * FROM mytable WHERE CONTAINS(c2,'李圓生')

    **********/

    2013年4月30日 上午 02:05

解答

  • 這個和32bit/64bit應該沒有關係, 也不像是unicode的問題

    不過ricoisme說的沒錯, 是中文斷字的問題

    是不是bug, 現在我不方便說, 留給微軟去證實與發布吧~~

    但是, 不管在32bit/64bit中, 應該是SQL的斷字出現問題就從SQL的斷字去處理

    早期確實可以去copy系統字義檔, 但實做後在許多production, 特別是有SSPS的環境

    肯定一堆怪問題跑出來, 如果不知道有動過字義檔, 找破頭也沒頭緒, 然後就會說

    "重灌就好了", 沒多久又說"SQL的全文檢索出問題了" => 過去的經驗

    上述的問題, 最簡單的方式就是自己去做一個SQL的斷字定義檔,

    把"元"這個字去做斷字, 就解決了, 前提是指定了斷字定義檔後要去重建FULLTEXT

    只是我沒法子解釋, 為何就李元生有問題, 林元生就沒有, 我看到這二個的字義碼相同的說

    • 已標示為解答 DBA新手 2013年5月14日 下午 01:52
    2013年5月14日 上午 07:58

所有回覆