【问题标题】:Matching several keywords against articles containing them then order by desc将多个关键字与包含它们的文章匹配,然后按 desc 排序
【发布时间】:2017-05-19 10:47:26
【问题描述】:

我正试图弄清楚如何解决这个问题,但无法解决这个问题 - 或者找到解决问题的最佳方法。我想要实现的是以下(Kw代表关键字)。

所有文章中 db 中的现有 kw: Kw1, Kw2, Kw3, Kw4, Kw5

使用关键字的文章

Art1:Kw1、Kw2、Kw3

Art2:Kw1、Kw2、Kw4

Art3:Kw4、Kw1、Kw5

Art4:Kw5、Kw4、Kw2

要匹配的关键字(由用户提交)

Kw1、Kw2、Kw3

基于关键字匹配次数最多的排名

艺术 1

艺术 2

第 3 条和第 4 条

技术规格

我正在尝试使用带有实体框架的 ASP.NET MVC 项目来实现这一点。该项目连接到一个 MS SQL 数据库,其中包含一个包含文章的表,以及另一个包含与每篇文章相关的关键字的表。

我最初的想法是以某种方式使用 LINQ,但我发现很难弄清楚如何做到这一点,如果可能的话。

非常感谢所有帮助我找到正确解决方法的方法!

编辑:数据结构

**KeywordTbl**
[KnowledgeDatabaseKeywordId] INT           IDENTITY (1, 1) NOT NULL,
[Keyword]                    NVARCHAR (64) NOT NULL,
[KnowledgeDatabaseId]        INT           NOT NULL,

**ArticlesTbl**
[KnowledgeDatabaseId] INT             IDENTITY (1, 1) NOT NULL,
[Title]               NVARCHAR (200)  NOT NULL,
[Summary]             NVARCHAR (1000) NOT NULL,
[Article]             NVARCHAR (MAX)  NOT NULL,

示例

**ArticlesTbl**
KnowledgeDatabaseId = 1
Title = "My title"
Summary = "A short summary"
Article = "Longer text"

**KeywordTbl**
KnowledgeDatabaseKeywordId = 1
Keyword = "Kw1"
KnowledgeDatabaseId = 1

KnowledgeDatabaseKeywordId = 2
Keyword = "Kw2"
KnowledgeDatabaseId = 1

【问题讨论】:

  • 您应该查看全文索引。
  • 可能不是最好的解决方案,但使用 linq 您可以对每个关键字运行并行查询,然后合并结果并对其进行排序。
  • 我认为当你说文章包含关键字时,这些是构成文章正文的关键字,还是单独存储的用于对文章进行分类的关键字?
  • iamdave - 关键字是单独存储的,它们可以被视为例如博客标签/对文章进行分类。
  • 保存这些关键字的数据结构是什么?这对于获得与您的情况实际相关的帮助非常重要。请添加您的数据结构和一些测试数据。此外,如果您想引用用户名以便通知我们您已标记我们,请在名称前使用 @ 符号,如下所示:@Subtractive

标签: c# sql-server asp.net-mvc entity-framework linq


【解决方案1】:

在不知道您的数据结构是什么的情况下,这是一个很难回答的问题,但希望下面是一个很好的起点,让您了解 SQL 如何能够处理您想要的内容。

如果您的 Keywords 与您的 Articles 一起保存在一个表中,您可以创建一个 Keywords 表来查找,可以使用临时表、表变量或派生表(我已经使用表变量易于编写示例),然后计算从 left join 返回的所有匹配项:

declare @t table (ArticleID int, Keyword nvarchar(10));
insert into @t values (1,'Kw1'),(1,'Kw2'),(1,'Kw3'),(2,'Kw1'),(2,'Kw2'),(2,'Kw4'),(3,'Kw4'),(3,'Kw1'),(3,'Kw5'),(4,'Kw5'),(4,'Kw4'),(4,'Kw2');

declare @kw table (Keyword nvarchar(10));
insert into @kw values('Kw1'),('Kw2'),('Kw3');

select t.ArticleID
        ,count(k.Keyword) as Matches
from @t t
    left join @kw k
        on(t.Keyword = k.Keyword)
group by t.ArticleID
order by Matches desc
        ,t.ArticleID;

输出:

+-----------+---------+
| ArticleID | Matches |
+-----------+---------+
|         1 |       3 |
|         2 |       2 |
|         3 |       1 |
|         4 |       1 |
+-----------+---------+

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多