Suggerimento per una tag cloud algoritmo
-
28-09-2019 - |
Domanda
Ho un MSSQL 2005 tabella:
[Companies](
[CompanyID] [int] IDENTITY(1,1) NOT NULL,
[Title] [nvarchar](128),
[Description] [nvarchar](256),
[Keywords] [nvarchar](256)
)
Voglio generare una nuvola di tag per questa società.Ma ho salvato tutte le parole chiave in una colonna separata da virgole.Suggerimenti per generare tag cloud dalla maggior parte delle parole chiave utilizzate.Ci potrebbero essere milioni di aziende in circa dieci parole chiave per ogni azienda.
Grazie.
Soluzione
Passaggio 1: separare le parole chiave in un giusto rapporto (tabella).
CREATE TABLE Keywords (KeywordID int IDENTITY(1,1) NOT NULL
, Keyword NVARCHAR(256)
, constraint KeywordsPK primary key (KeywordID)
, constraint KeywordsUnique unique (Keyword));
Passaggio 2: Mappare la molti-a-molti relazione tra aziende e tag in una tabella separata, come tutti i molti-a-molti rapporti:
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));
Passaggio 3: Utilizzare una semplice query GROUP BY per generare la 'nuvola' (con l'esempio prendendo la 'nuvola' per significare le più comuni 100 tag):
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;
Passo 4:. La cache il risultato come cambia raramente e calcola costoso
Altri suggerimenti
Preferirei mille volte vedere il vostro disegno normalizzati come suggerito da Remo , ma se siete in un punto in cui non è possibile modificare il vostro disegno ...
È possibile utilizzare una funzione di analisi (l'esempio userò è tratto da qui ), per analizzare le parole chiave e le considero.
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
Sia Remus e Joe sono corrette, ma sì come quello che Joe ha detto che se non avete una scelta, quindi devi vivere con esso.Penso di poter offrire una soluzione semplice, utilizzando il Tipo di Dati XML.È già possibile visualizzare facilmente analizzato colonna eseguendo questa query
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)
ora, sapendo che si può fare, tutto quello che dovete fare è quello di raggruppare e contare, ma non è possibile raggruppare i metodi XML, quindi il mio consiglio è di creare una visualizzazione della query di cui sopra
CREATE 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
eseguire le vostre contare sulla vista
SELECT Keywords, COUNT(*) AS KeyWordCount FROM DissectedKeywords
GROUP BY Keywords
ORDER BY Keywords
Comunque ecco l'articolo completo -->http://anyrest.wordpress.com/2010/08/13/converting-parsing-delimited-string-column-in-sql-to-rows/