我数据库中有一个包含自由文本字段列的表格。
我想知道每个单词在所有行中出现的频率,甚至可以为所有单词计算TF-IDF,其中我的文档是该字段每行的值。
使用Sql查询是否可以计算此内容?如果不行或者有更简单的方法,请指引我。
感谢您,
Jon
我想知道每个单词在所有行中出现的频率,甚至可以为所有单词计算TF-IDF,其中我的文档是该字段每行的值。
使用Sql查询是否可以计算此内容?如果不行或者有更简单的方法,请指引我。
感谢您,
Jon
sys.dm_fts_index_keywords
和sys.dm_fts_index_keywords_by_document
表值函数以获取出现次数。
编辑:实际上,即使没有创建持久的全文索引,您仍然可以利用解析器。WITH testTable AS
(
SELECT 1 AS Id, N'how now brown cow' AS txt UNION ALL
SELECT 2, N'she sells sea shells upon the sea shore' UNION ALL
SELECT 3, N'red lorry yellow lorry' UNION ALL
SELECT 4, N'the quick brown fox jumped over the lazy dog'
)
SELECT display_term, COUNT(*) As Cnt
FROM testTable
CROSS APPLY sys.dm_fts_parser('"' + REPLACE(txt,'"','""') + '"', 1033, 0,0)
WHERE TXT IS NOT NULL
GROUP BY display_term
HAVING COUNT(*) > 1
ORDER BY Cnt DESC
display_term Cnt
------------------------------ -----------
the 3
brown 2
lorry 2
sea 2
SQL Server 2008的解决方案:
以下是表格:
CREATE TABLE MyTable (id INT, txt VARCHAR(MAX));
这里是 SQL 查询:
SELECT sum(case when TSplitted.txt_word = 'searched' then 1 else 0 end) as cnt_searched
, count(*) as cnt_all
FROM MyTable MYT
INNER JOIN Fn_Split(MYT.id,' ',MYT.txt) TSplitted on MYT.id=TSplitted.id
这里是表值函数 Fn_Split(@id int, @separator VARCHAR(32), @string VARCHAR(MAX))(摘自这里):
CREATE FUNCTION Fn_Split (@id int, @separator VARCHAR(32), @string VARCHAR(MAX))
RETURNS @t TABLE
(
ret_id INT
,txt_word VARCHAR(MAX)
)
AS
BEGIN
DECLARE @xml XML
SET @XML = N'<root><r>' + REPLACE(@s, @separator, '</r><r>') + '</r></root>'
INSERT INTO @t(ret_id, val)
SELECT @id, r.value('.','VARCHAR(5)') as Item
FROM @xml.nodes('//root/r') AS RECORDS(r)
RETURN
END