我们在下表中添加了自由文本搜索:
| 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 | kayer-meyar |
当我使用'"ME*"'
时。它不返回| 2 | KA-ME |
。问题是因为您的条件只允许单词开头(而不是end with
或in a middle
)ME + 至少一个字符
。 你可以说,“那么它为什么会返回| 1 | kayer-meyar |
因为字符串me
就在这个中间词?”。嗯,这是因为全文搜索不将其视为一个单独的单词,而是将其视为两个单独的单词(类似于kayer meyar
),因此它满足了要求(me*
)。同样,在KA-ME
的情况下,它识别为KA ME
而不是单个单词,并且它也失败了条件(尽管它以ME
开头) > 但之后没有多余的字符) - 您是否尝试过重建全文索引? .
现在解决方案是:
我已关闭全文搜索查询的非索引字列表
使用此查询(我的表名称是 MyTable
):
ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF
这是我的完整查询:
--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/