Vorschlag für einen Tag-Cloud-Algorithmus
-
28-09-2019 - |
Frage
Ich habe eine MSSQL 2005 Tabelle:
[Companies](
[CompanyID] [int] IDENTITY(1,1) NOT NULL,
[Title] [nvarchar](128),
[Description] [nvarchar](256),
[Keywords] [nvarchar](256)
)
Ich mag einen Tag-Cloud für diese Unternehmen generieren. Aber ich habe alle Keywords in einer Spalte durch Komma getrennt gespeichert. Irgendwelche Vorschläge, wie Tag-Cloud von den meisten verwendeten Schlüsselwörter zu erzeugen. Es könnte Millionen von Unternehmen ca. zehn Keywords pro Unternehmen sein.
Danke.
Lösung
Schritt 1: Trennen Sie die Schlüsselwörter in eine richtige Beziehung (Tabelle).
CREATE TABLE Keywords (KeywordID int IDENTITY(1,1) NOT NULL
, Keyword NVARCHAR(256)
, constraint KeywordsPK primary key (KeywordID)
, constraint KeywordsUnique unique (Keyword));
Schritt 2: Karte des many-to-many-Beziehung zwischen Unternehmen und Tags in eine separate Tabelle, wie alle many-to-many-Beziehungen:
CREATE TABLE CompanyKeywords (
CompanyID int not null
, KeywordID int not null
, constraint CompanyKeywords primary key (KeywordID, CompanyID)
, constraint CompanyKeyword_FK_Companies
foreign key (CompanyID)
references Companies(CompanyID)
, constraint CompanyKeyword_FK_Keywords
foreign key (KeywordID)
references Keywords (KeywordID));
3. Schritt: Verwenden einer einfachen GROUP BY-Abfrage der ‚Wolke‘ (von Beispiel genommen wird, die ‚Wolke‘, die am häufigsten 100 Tags bedeuten) zu erzeugen:
with cte as (
SELECT TOP 100 KeywordID, count(*) as Count
FROM CompanyKeywords
group by KeywordID
order by count(*) desc)
select k.Keyword, c.Count
from cte c
join Keyword k on c.KeywordID = k.KeywordID;
Schritt 4:. Cache das Ergebnis, wie es ändert sich nur selten und es berechnet teuer
Andere Tipps
Ich würde viel lieber sehen, Ihr Design als normalisiert von Remus vorgeschlagen , aber wenn man an einem Punkt, wo Sie nicht Ihr Design ändern können ...
Sie können eine Parsing-Funktion verwenden (das Beispiel, das ich genommen verwenden werden von hier ), um Ihre Keywords zu analysieren und sie zählen.
CREATE FUNCTION [dbo].[fnParseStringTSQL] (@string NVARCHAR(MAX),@separator NCHAR(1))
RETURNS @parsedString TABLE (string NVARCHAR(MAX))
AS
BEGIN
DECLARE @position int
SET @position = 1
SET @string = @string + @separator
WHILE charindex(@separator,@string,@position) <> 0
BEGIN
INSERT into @parsedString
SELECT substring(@string, @position, charindex(@separator,@string,@position) - @position)
SET @position = charindex(@separator,@string,@position) + 1
END
RETURN
END
go
create table MyTest (
id int identity,
keywords nvarchar(256)
)
insert into MyTest
(keywords)
select 'sql server,oracle,db2'
union
select 'sql server,oracle'
union
select 'sql server'
select k.string, COUNT(*) as count
from MyTest mt
cross apply dbo.fnParseStringTSQL(mt.keywords,',') k
group by k.string
order by count desc
drop function dbo.fnParseStringTSQL
drop table MyTest
Sowohl Remus und Joe sind korrekt, aber ja wie das, was Joe sagte, wenn Sie die Wahl nicht haben, dann haben Sie mit ihm zu leben. Ich glaube, ich kann Ihnen eine einfache Lösung bieten, indem ein XML-Datentyp verwendet wird. Sie können bereits sehen leicht die geparsten Spalte, indem Sie diese Abfrage
WITH myCommonTblExp AS (
SELECT CompanyID,
CAST('<I>' + REPLACE(Keywords, ',', '</I><I>') + '</I>' AS XML) AS Keywords
FROM Companies
)
SELECT CompanyID, RTRIM(LTRIM(ExtractedCompanyCode.X.value('.', 'VARCHAR(256)'))) AS Keywords
FROM myCommonTblExp
CROSS APPLY Keywords.nodes('//I') ExtractedCompanyCode(X)
jetzt zu wissen, dass Sie das tun können, was Sie tun müssen, ist, sie zu gruppieren und zählen, aber Sie können nicht Gruppe von XML-Methoden so mein Vorschlag ist, einen Blick auf die Abfrage über
erstellenCREATE VIEW [dbo].[DissectedKeywords]
AS
WITH myCommonTblExp AS (
SELECT
CAST('<I>' + REPLACE(Keywords, ',', '</I><I>') + '</I>' AS XML) AS Keywords
FROM Companies
)
SELECT RTRIM(LTRIM(ExtractedCompanyCode.X.value('.', 'VARCHAR(256)'))) AS Keywords
FROM myCommonTblExp
CROSS APPLY Keywords.nodes('//I') ExtractedCompanyCode(X)
GO
und führen Sie Ihre Zählung auf dieser Ansicht
SELECT Keywords, COUNT(*) AS KeyWordCount FROM DissectedKeywords
GROUP BY Keywords
ORDER BY Keywords
Sowieso ist hier die ganzen Artikel -> http://anyrest.wordpress.com/2010/08/13/converting-parsing-delimited-string-column-in-sql-to-rows/