sql-server - SQL Azure CONTAINS 不返回所有结果

标签 sql-server azure azure-sql-database freetext

我们在下表中添加了自由文本搜索:

| 1 | kayer-meyar | 
| 2 | KA-ME |

但是,

select * 
from Names 
where CONTAINS(name, '"ME*"')

仅返回:

| 1 | kayer-meyar |

同时,

select * 
from Names 
where CONTAINS(name, '"KA*"')

同时返回:

| 1 | kayer-meyar |
| 2 | KA-ME |

当我们运行时:

select * 
from sys.dm_fts_parser('"KA-ME"', 1033, NULL, 0)

返回:

ka-me
ka
me

最佳答案

在搜索和调整你的问题后,我发现全文搜索有两个主要错误:

  1. 连字符可能被视为断词。它仅返回 | 1 | kayer-meyar | 当我使用 '"ME*"' 时。它不返回 | 2 | KA-ME |。问题是因为您的条件只允许单词开头(而不是 end within a middle) ME + 至少一个字符你可以说“那么它为什么会返回 | 1 | kayer-meyar | 因为字符串 me 就在这个中间词?”。嗯,这是因为全文搜索不将其视为一个单独的单词,而是将其视为两个单独的单词(类似于 kayer meyar ),因此它满足了要求(me*)。同样,在 KA-ME 的情况下,它识别为 KA ME 而不是单个单词,并且它也失败了条件(尽管它以 ME 开头) > 但之后没有多余的字符)
  2. 您是否尝试过重建全文索引? .

现在解决方案是: 我已关闭全文搜索查询的非索引字列表 使用此查询(我的表名称是 MyTable):

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

然后运行您的查询。这次你会得到你想要的结果。 enter image description here

这是我的完整查询:

--CREATE TABLE MyTable
--(
--Id INT IDENTITY(1,1),
--Name varchar(max)  Not Null
--)

---- To see if FULLTEXT installed or not
--SELECT SERVERPROPERTY('IsFullTextInstalled')

---- http://stackoverflow.com/questions/2306825/why-cant-i-create-this-sql-server-full-text-index
---- https://technet.microsoft.com/en-us/library/ms187317.aspx
---- http://stackoverflow.com/questions/2306825/why-cant-i-create-this-sql-server-full-text-index
---- http://stackoverflow.com/questions/2315577/sql-server-2008-full-text-search-on-a-table-with-a-composite-primary-key

--CREATE UNIQUE INDEX ui_MyTable ON MyTable(Id); 
--select name from sysindexes where object_id('MyTable') = id;

--CREATE FULLTEXT CATALOG ft AS DEFAULT; 

--CREATE FULLTEXT INDEX ON MyTable(Name)   
--   KEY INDEX ui_MyTable  
--   WITH STOPLIST = SYSTEM;  
--GO  

--INSERT INTO MyTable(Name) VALUES('kayer-meyar'),('KA-ME');


ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

select * 
from MyTable 
where CONTAINS(Name, '"ME*"')

select *
from MyTable 
where CONTAINS(Name, '"KA*"')

关于sql-server - SQL Azure CONTAINS 不返回所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38075126/

相关文章:

azure - 如何使用复合身份向 Azure 进行身份验证以访问 Azure Key Vault

python - Azure Databricks 未在 Spark 上并行化

azure - 正在将文件从 Azure Blob 存储加载到 Azure SQL DB : error code 86 The specified network password is not correct

sql-server-2008 - 从 SQL Server 2008 到 Azure 的 SSIS 包 - 手动执行,但作为 SQL 作业运行时失败

java - SQL Azure 和 JAVA 不想运行查询

sql-server - 尝试 SQL 注入(inject)攻击 - 他们想做什么?

sql-server - 将 Foxpro 数据库传输到 SQL Server

SQL Server 2008 按主键选择约束顺序

SQL Server - 如何从日期时间字段中选择日期时间

Visual Studio for Azure Service Fabric 中的 Azure 资源管理器模板