Suggestion pour un nuage de tags algorithme
-
28-09-2019 - |
Question
J'ai un MSSQL 2005 tableau:
[Companies](
[CompanyID] [int] IDENTITY(1,1) NOT NULL,
[Title] [nvarchar](128),
[Description] [nvarchar](256),
[Keywords] [nvarchar](256)
)
Je veux générer un nuage de tags pour cette entreprises.Mais j'ai enregistré tous les mots clés dans une colonne séparée par des virgules.Des suggestions sur la façon de générer nuage de tags par la plupart des mots-clés utilisés.Il pourrait y avoir des millions de sociétés à environ dix mots-clés par l'entreprise.
Je vous remercie.
La solution
Étape 1:séparer les mots clés dans une bonne relation (table).
CREATE TABLE Keywords (KeywordID int IDENTITY(1,1) NOT NULL
, Keyword NVARCHAR(256)
, constraint KeywordsPK primary key (KeywordID)
, constraint KeywordsUnique unique (Keyword));
Étape 2:Carte de la plusieurs-à-plusieurs relation entre les entreprises et les balises dans une table distincte, comme tous les plusieurs-à-plusieurs relations:
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));
Étape 3:L'utilisation d'un simple GROUPE PAR requête pour générer le "cloud computing" (par exemple dans le "cloud" dans le sens le plus commun de 100 étiquettes):
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;
Étape 4:mettre en cache le résultat de l'évolution de la que rarement et il calcule cher.
Autres conseils
Je préfère voir votre conception normalisée comme suggéré par Remus, mais si vous êtes à un point où vous ne pouvez pas changer votre design...
Vous pouvez utiliser une fonction d'analyse syntaxique (l'exemple que je vais utiliser est pris à partir de ici), pour analyser vos mots-clés et de les compter.
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
Les deux Remus et Joe sont corrects mais oui comme quoi Joe a dit que si vous n'avez pas un choix, puis vous avez à vivre avec elle.Je pense que je peux vous offrir une solution facile en utilisant un Type de Données XML.Vous pouvez déjà visualiser facilement l'analyse de la colonne en faisant cette requête
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)
maintenant, sachant que vous pouvez le faire, tout ce que vous avez à faire est de les regrouper et de les compter, mais vous ne pouvez pas le groupe de méthodes XML donc, ma suggestion est de créer un affichage de la requête ci-dessus
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
et effectuer votre compte sur ce point de vue
SELECT Keywords, COUNT(*) AS KeyWordCount FROM DissectedKeywords
GROUP BY Keywords
ORDER BY Keywords
De toute façon, ici, est l'intégralité de l'article -->http://anyrest.wordpress.com/2010/08/13/converting-parsing-delimited-string-column-in-sql-to-rows/