All articles

SQL Server Full text index probléma és megoldás

Published 2014-02-10 - Last modified 2014-04-10

Original: https://soci.hu/blog/index.php/2014/02/10/sql-server-full-text-index-problema-es-megoldas/

Az egyik cégnek írtam full text keresős kódot. Az egész elég egyszerű stuff, full text catalogot kell létrehozni, és megjelölni az indexelendő oszlopokat. A catalog lehet accent sensitive vagy nem (ékezet számít-e), de mindig case insensitive (kis-nagy betű nem számít). A táblák oszlopainál meg kell adni egy word breakert, ez tördeli fel a szöveget szavakra, ezt indexeli, ebben keresünk.
A keresést az sql where feltételben contains és társai kulcsszavakkal lehet elérni. Én a containstable-t szoktam használni, mert így hatékonyan lehet limitálni a visszaadott halmazt, részletekbe most nem megyek bele.
Sokan nem tudják, de a bináris tartalomban is lehet keresni. Ehhez meg kell adni egy plusz oszlopot, amiben a tartalom file extensionjét kell megadni. Ez alapján kikeresi a registryben a megfelelő IFilter (ez még com) implementációt, ami kiszedi neki a szavakat a bináris moslékból. Van pl. pdfhez, htmlhez, office doksikhoz, képekhez (állítólag ocrezik, nekem még nem működött), stb. Szóval hatékonyan lehet kerestetni nagy doksikban is.
A probléma esetünkben az volt, hogy C#-ra adott vissza eredményeket, c#-ra nem. Ez ezért fura, mert a case sensitivity-t nem is lehet állítani, alapban nem az.
Már elkezdtem írni az ms fórumra, amikor a precíz dokumentálás érdekében elkezdtem bepasztázni a DDLeket:

CREATE FULLTEXT CATALOG [xxx] WITH ACCENT_SENSITIVITY = OFF;
CREATE FULLTEXT INDEX ON [KB].[Article](
[ArticleText] LANGUAGE [English], 
[ArticleTitle] LANGUAGE [English])
KEY INDEX [PK_Article] ON ([xxx], FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM);

Na, hol a hiba?
Rossz volt a word breaker! Véletlenül angolt állítottam be. Ezzel már egyszer szívtam, akkor az ékezetes keresés volt beteg, főleg a híres őű betűink miatt.
Mi a helyes, ha magyar szöveget indexelünk? Hungarian sajnos nincs. Szlovák van, román van, ukrán van. Magyar nincs. Mi marad nekünk? Neutral. Mi ilyen langyi nemzet vagyunk, ilyen semlegesek, a mi karaktereink mellett csak ezzel lehet rendesen kerestetni. Persze, ragozást, szótőkeresést ne várjunk így el, ami a többi nyelvben rendesen van implementálva.
De örüljünk annak, ami van, neutral beállítás mellett már mindkét szí sárpot megtalálja.
Hogy angol mellett miért nem? Nem tudom.