Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Arabic FullText Search in SQL Server

I have a problem in Arabic Full Text Search in SQL-Server, this link says that we can use Arabic in full text search.

To describe more, I've enabled full text search on one of my columns which contains Arabic and English texts.

When i use full text search for English inputs every thing works fine but in Arabic it doesn't.

please notice that i also test my queries with other tables that just have Arabic contents and again i got nothing.

Used queries are like this:

select * from tbl where freetext(title, '"*شمس*"')

SELECT * FROM sys.dm_fts_parser('"الاستنتاجات ونصائح للوقاية من أشعة الشمس"', 1025, 0, 0) WHERE special_term <> 'Noise Word' AND display_term IS NOT NULL

like image 848
Elyas Hadizadeh Avatar asked Nov 07 '22 20:11

Elyas Hadizadeh


1 Answers

I would recommend this approach:

1) Make sure your column in the database is nvarchar 2) Make sure you are inserting nvarchar value into the column.

Here is a small demo of why this is important. Probably you have one of the issues shown in this script.

CREATE TABLE ftstest (Id int PRIMARY KEY, name varchar(1000), nameA varchar(1000) COLLATE Arabic_BIN, nameN nvarchar(1000) )
GO

-- CREATE FTS index for the ftstest table using designer

INSERT INTO ftstest VALUES(1, N'"الاستنتاجات ونصائح للوقاية من أشعة الشمس"', N'"الاستنتاجات ونصائح للوقاية من أشعة الشمس"', N'"الاستنتاجات ونصائح للوقاية من أشعة الشمس"')
GO

INSERT INTO ftstest VALUES (2, '"الاستنتاجات ونصائح للوقاية من أشعة الشمس"', '"الاستنتاجات ونصائح للوقاية من أشعة الشمس"', '"الاستنتاجات ونصائح للوقاية من أشعة الشمس"')
GO

SELECT * FROM ftstest WHERE CONTAINS(name, N'"الاستنتاجات ونصائح للوقاية من أشعة الشمس*"') 
SELECT * FROM ftstest WHERE CONTAINS(nameA, N'"الاستنتاجات ونصائح للوقاية من أشعة الشمس*"') 
SELECT * FROM ftstest WHERE CONTAINS(nameN, N'"الاستنتاجات ونصائح للوقاية من أشعة الشمس*"') 
SELECT * FROM ftstest WHERE CONTAINS(name, '"الاستنتاجات ونصائح للوقاية من أشعة الشمس*"') 
SELECT * FROM ftstest WHERE CONTAINS(nameA, '"الاستنتاجات ونصائح للوقاية من أشعة الشمس*"') 
SELECT * FROM ftstest WHERE CONTAINS(nameN, '"الاستنتاجات ونصائح للوقاية من أشعة الشمس*"') 

The same issue with your second query. '' - means a varchar literal, N'' - means nvarchar. Try this query to check:

SELECT * FROM sys.dm_fts_parser(N'"الاستنتاجات ونصائح للوقاية من أشعة الشمس"', 1025, 0, 0) 
like image 89
Denis Reznik Avatar answered Dec 10 '22 05:12

Denis Reznik