gpt4 book ai didi

mysql - 支持关键字搜索的数据库模式或框架

转载 作者:行者123 更新时间:2023-11-29 12:30:13 25 4
gpt4 key购买 nike

要向数据库中的业务对象之一添加关键字/标签,我们将表命名为users。我考虑过添加一个 tags 表和一个 usertags 表,但我看不到一种简单的方法来执行包含 的查询和。例如,我希望能够返回所有具有 tag A AND B 的 users,以及查询 users tag A OR B。OR 查询很简单,但 AND 查询则很

我什至考虑过将所有 user 记录放入 json 支持的数据库中,这样我就可以像这样复制所有用户:

{
user_id:1,
keyword:"A",
keyword:"B"
}

等等。但我不确定像 MongoDB 这样的数据库在运行这样的查询时性能如何。

另一种选择是在 user 表上添加一个 tags 字段,并使用 REGEX 查询。在某些方面,我最喜欢这个,因为这意味着进行临时查询要容易得多,但我担心性能。

请注意,标签并不是我们需要搜索的唯一字段,因此理想情况下,我们应该有一个支持日期范围搜索以及针对其他字段搜索的解决方案。

最佳答案

就此而言,我只能真正谈论 MongoDB,所以我会坚持下去。

让我们假设一个更准确的模型,例如

{
_id: "foo@bar.com",
keywords: [ "A", "B" ],
joined: ISODate("2014-12-28T12:00:00.123Z"),
tags: [ "C", "D" ],
location: { type: "Point", coordinates: [ 38.1200538, -86.9141607 ] },
notes: "Lorem ipsum dolor sic amet."
}

MongoDB 的性能或多或少由两个因素决定:您查询的字段是否已索引以及索引是否位于 RAM 中。一般来说,MongoDB 会尝试将至少所有索引保留在 RAM 中,并尽可能保留尽可能大的数据子集。为字段建立索引非常容易。为了满足您的第一个要求,我们对 keywords 字段建立索引:

db.yourCollection.ensureIndex({ keywords: 1})

现在发生的事情是,MongoDB 将创建一个关键字列表和指向相应文档的链接。因此,如果您查询关键字“A”

db.yourCollection.find({keywords: "A"})

只有真正包含关键字“A”的文档才会被读取并返回。这称为索引扫描。如果没有“关键字”索引,MongoDB 将读取集合中的每个文档,检查关键字字段是否包含“A”,并将相应文档添加到结果集中,这称为集合扫描。

现在,检查同时包含“A”和“B”关键字的文档,这将相当简单:

db.yourCollection.find({$or: [ {keywords:"A"}, {keywords:"B"} ] })

由于我们已经对“关键字”字段建立了索引,因此逻辑检查是在 RAM 中完成的,并将相应的文档添加到结果集中。

对于正则表达式搜索,它们绝对是可能的,并且对于索引字段来说速度相当快:

db.yourCollection.find({keywords: /^C.*/i})

将使用索引扫描返回包含以字母“c”(不区分大小写)开头的关键字的所有文档。

至于您对日期范围进行查询的要求:

db.yourCollection.find({joined:
{
$gte: ISODate("2014-12-28T00:00:00.000Z"),
$lt: ISODate("2014-12-29T00:00:00.000Z")
}
})

将返回在 2014 年 12 月 28 日加入的所有用户。由于我们尚未在该字段上创建索引,因此将使用集合扫描。当然,您可以在“joined”字段上创建索引。

因此,假设您想要查找来自印第安纳州 Santa Claus 且带有关键字“A”的所有用户:

db.yourCollection.find({
keywords: "A",
location: {
$nearSphere : {
$geometry: {
type : "Point",
coordinates: [ 38.1200538, -86.9141607 ]
},
$minDistance: 0,
$maxDistance: 10000
}
}
})

这将返回...什么也没有,iirc,因为我们必须创建一个 geospatial index第一:

db.collection.ensureIndex( { location : "2dsphere" } )

现在提到的查询将按预期工作。

结论

MongoDB 可以满足您的要求,并且具有适当的索引和良好的性能。但是,您可能想深入研究 MongoDB 的限制。

您可能想多读一点。以下是我的建议:

  1. Introduction to MongoDB
  2. Index documentation
  3. Data modelling introduction

关于mysql - 支持关键字搜索的数据库模式或框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27677396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com