2

我想知道是否有一种方法可以使用FREETEXT.

例如:

SELECT * 
FROM table 
WHERE FREETEXT(column_name, 'search term')

我希望能够查看 column_name 中文本的哪些部分触发了与“搜索词”的匹配,因为FREETEXT返回的记录中搜索的列不仅仅是/部分中所述的搜索词模式匹配。FREETEXTFREETEXTTABLE

我知道 usingFREETEXTTABLE可以返回排名和键,但如果可能的话,我需要知道哪些实际术语触发了匹配。

谢谢

4

4 回答 4

1

Disclaimer, I haven't done this -- I'm going from documentation. 我不确定这是否能满足您的需求,但您可以看到搜索是如何被标记化的:从这里

在查询中应用给定的分词器、同义词库和停止列表组合后,您可以查看全文搜索如何使用 sys.dm_fts_parser 动态管理视图对结果进行标记。有关详细信息,请参阅sys.dm_fts_parser (Transact-SQL)

我猜您是否想知道哪个部分(令牌)导致匹配 - 您可能需要对各个令牌运行搜索并比较结果集以查看哪个令牌或多个令牌(搜索词/秒)导致给定的匹配。

于 2019-09-30T17:57:21.377 回答
0

如果你想用full text search另一种方法,那么使用大量的方法,下面写了很少的方法

Select * from Table
Where Column_Name Contains('some thing')

Select * from Table
Where Column_Name exists ('some thing')

Select * from Table
Where Column_Name in ('some thing')

Select * from Table
Where Column_Name =(some) ('some thing')
于 2019-09-27T21:53:16.963 回答
0

你可以试试 LIKE

SELECT * 
FROM table 
WHERE column_name like ('%search term%')
于 2019-09-30T15:45:28.580 回答
0

您将需要 拆分字符串功能

然后,您将创建一个Temporary table永久的。

就像在我的示例 StagingFreeText 中一样(根据要求定义数据类型)

create table StagingFreeText (col varchar(100) not null)

Full Text Index然后创建StagingFreeText

在脚本开始时总是截断表

Truncate table StagingFreeText

然后将结果插入StagingFreeText

 ;with CTE as
(
SELECT * 
    FROM table 
    WHERE FREETEXT(column_name, 'search term')
)
insert into StagingFreeText(col)
SELECT value 
FROM CTE 
cross apply(select value from dbo.split_string(column_name,' '))ca

再次应用上述搜索条件

SELECT * 
FROM StagingFreeText 
WHERE FREETEXT(col, 'search term')

注意:我的脚本未经测试,但想法非常清楚。

或者,如果您不想在其上创建另一个自由文本索引,StagingFreeText则可以拆分Search Term#temp 表并StagingFreeText与 #temp 表连接

于 2019-10-01T06:14:44.443 回答