Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

February 10, 2014 / by Zsolt Soczó

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

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.

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

2 COMMENTS

  • hron84 February 16, 2014

    “Rossz volt a word breaker! Véletlenül angolt állítottam be.”

    Valami nem stimmel. Mind angol mind magyar eseteben a word breaker mindenkepp whitespace kell, hogy legyen, raadasul a DDL-ben en nem latom nyomat a word breaker allitasanak. Szerintem a nyelv volt rossz, abbol lehet angolt beallitani, magyar – illetve neutral – helyett.

  • Soczó Zsolt February 19, 2014

    Igen, logikusan angol mellett is kellett volna mennie, de nem ment. 2 gépen is kipróbáltam.