SQL Server 中的阿拉伯语全文搜索

Ely*_*deh 5 sql-server full-text-search sql-server-2012 sql-server-2014

我在 SQL-Server 中的阿拉伯语全文搜索中遇到问题,此链接说我们可以在全文搜索中使用阿拉伯语。

为了进行更多描述,我在包含阿拉伯语和英语文本的专栏之一上启用了全文搜索。

当我对英文输入使用全文搜索时,一切正常,但在阿拉伯语中则不然。

请注意,我还使用其他只有阿拉伯语内容的表测试了我的查询,但我还是一无所获。

使用的查询是这样的:

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

Den*_*nik 2

我会推荐这种方法:

\n\n

1) 确保数据库中的列是 nvarchar\n2) 确保将 nvarchar 值插入到列中。

\n\n

这是一个小演示,说明了为什么这很重要。您可能遇到此脚本中显示的问题之一。

\n\n
CREATE TABLE ftstest (Id int PRIMARY KEY, name varchar(1000), nameA varchar(1000) COLLATE Arabic_BIN, nameN nvarchar(1000) )\nGO\n\n-- CREATE FTS index for the ftstest table using designer\n\nINSERT INTO ftstest VALUES(1, N\'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3"\', N\'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3"\', N\'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3"\')\nGO\n\nINSERT INTO ftstest VALUES (2, \'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3"\', \'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3"\', \'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3"\')\nGO\n\nSELECT * FROM ftstest WHERE CONTAINS(name, N\'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3*"\') \nSELECT * FROM ftstest WHERE CONTAINS(nameA, N\'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3*"\') \nSELECT * FROM ftstest WHERE CONTAINS(nameN, N\'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3*"\') \nSELECT * FROM ftstest WHERE CONTAINS(name, \'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3*"\') \nSELECT * FROM ftstest WHERE CONTAINS(nameA, \'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3*"\') \nSELECT * FROM ftstest WHERE CONTAINS(nameN, \'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3*"\') \n
Run Code Online (Sandbox Code Playgroud)\n\n

您的第二个查询也有同样的问题。\'\' - 表示 varchar 文字,N\'\' - 表示 nvarchar。尝试这个查询来检查:

\n\n
SELECT * FROM sys.dm_fts_parser(N\'"\xd8\xa7\xd9\x84\xd8\xa7\xd8\xb3\xd8\xaa\xd9\x86\xd8\xaa\xd8\xa7\xd8\xac\xd8\xa7\xd8\xaa \xd9\x88\xd9\x86\xd8\xb5\xd8\xa7\xd8\xa6\xd8\xad \xd9\x84\xd9\x84\xd9\x88\xd9\x82\xd8\xa7\xd9\x8a\xd8\xa9 \xd9\x85\xd9\x86 \xd8\xa3\xd8\xb4\xd8\xb9\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb4\xd9\x85\xd8\xb3"\', 1025, 0, 0) \n
Run Code Online (Sandbox Code Playgroud)\n