我正在构建一个应用程序,允许人们在可用/不可用时进行标记,并允许其他人在此期间预订约会。但是,当有人进行搜索时,我很难找到一个很好的方法来存储和查询可用性。
例如:
什么是存储和查询数据的有效方法?
其他注释:
发布于 2019-09-30 05:42:44
我很清楚地利用了数据类型 (引入了这里)。您可以为每个主机和每个可用性创建一个文档(或者如果您想要更细粒度的数据,可以创建该主机的每小时一个文档)。考虑到上面的要求,如下所示:
首先创建索引和映射:
PUT hosts
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"availability": {
"type": "date_range"
}
}
}
}然后添加您的主机的可用度(我决定使用GMT时区,以便小时数与上面提到的小时匹配1:1 ):
PUT hosts/_doc/_bulk
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-01T07:00:00.000Z", "lte": "2019-10-01T12:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-01T13:00:00.000Z", "lte": "2019-10-01T16:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-03T07:00:00.000Z", "lte": "2019-10-03T16:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-08T07:00:00.000Z", "lte": "2019-10-08T16:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-11T09:00:00.000Z", "lte": "2019-10-11T10:00:00.000Z" }}
{"index": {}}
{ "name": "A", "availability": { "gte": "2019-10-11T12:00:00.000Z", "lte": "2019-10-11T18:00:00.000Z" }}
{"index": {}}
{ "name": "B", "availability": { "gte": "2019-10-01T09:00:00.000Z", "lte": "2019-10-01T20:00:00.000Z" }}
{"index": {}}
{ "name": "B", "availability": { "gte": "2019-10-04T09:00:00.000Z", "lte": "2019-10-04T20:00:00.000Z" }}
{"index": {}}
{ "name": "B", "availability": { "gte": "2019-10-05T09:00:00.000Z", "lte": "2019-10-05T20:00:00.000Z" }}
{"index": {}}
{ "name": "B", "availability": { "gte": "2019-10-06T09:00:00.000Z", "lte": "2019-10-06T20:00:00.000Z" }}那么使用查询查询就很容易了。
用户C正在搜索10月6日至8日下午4点至下午6点的可用时间,因此应该只查看主机B。
POST hosts/_search
{
"query": {
"bool": {
"should": [
{
"range": {
"availability": {
"gte": "2019-10-06T16:00:00.000Z",
"lte": "2019-10-06T18:00:00.000Z",
"relation": "contains"
}
}
},
{
"range": {
"availability": {
"gte": "2019-10-07T16:00:00.000Z",
"lte": "2019-10-07T18:00:00.000Z",
"relation": "contains"
}
}
},
{
"range": {
"availability": {
"gte": "2019-10-08T16:00:00.000Z",
"lte": "2019-10-08T18:00:00.000Z",
"relation": "contains"
}
}
}
]
}
}
}结果:只有宿主B =>
{
"_index" : "hosts",
"_type" : "_doc",
"_id" : "KzOggG0BzetAdRPqckxN",
"_score" : 1.0,
"_source" : {
"name" : "B",
"availability" : {
"gte" : "2019-10-06T09:00:00.000Z",
"lte" : "2019-10-06T20:00:00.000Z"
}
}
}用户D正在搜索10月9-12日上午9点至下午1点的可用时间,因此应该只查看主机A。
POST hosts/_search
{
"query": {
"bool": {
"should": [
{
"range": {
"availability": {
"gte": "2019-10-09T09:00:00.000Z",
"lte": "2019-10-09T13:00:00.000Z",
"relation": "intersects"
}
}
},
{
"range": {
"availability": {
"gte": "2019-10-10T09:00:00.000Z",
"lte": "2019-10-10T13:00:00.000Z",
"relation": "intersects"
}
}
},
{
"range": {
"availability": {
"gte": "2019-10-11T09:00:00.000Z",
"lte": "2019-10-11T13:00:00.000Z",
"relation": "intersects"
}
}
},
{
"range": {
"availability": {
"gte": "2019-10-12T09:00:00.000Z",
"lte": "2019-10-12T13:00:00.000Z",
"relation": "intersects"
}
}
}
]
}
}
}结果:只有宿主A =>
{
"_index" : "hosts",
"_type" : "_doc",
"_id" : "JzOggG0BzetAdRPqckxN",
"_score" : 1.0,
"_source" : {
"name" : "A",
"availability" : {
"gte" : "2019-10-11T12:00:00.000Z",
"lte" : "2019-10-11T18:00:00.000Z"
}
}
},
{
"_index" : "hosts",
"_type" : "_doc",
"_id" : "JjOggG0BzetAdRPqckxN",
"_score" : 1.0,
"_source" : {
"name" : "A",
"availability" : {
"gte" : "2019-10-11T09:00:00.000Z",
"lte" : "2019-10-11T10:00:00.000Z"
}
}
}用户E正在查找10月1日主机A的可用时间,因此可以在上午7时至上午11时和下午1时至下午4时预约1小时。
POST hosts/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"name": "A"
}
},
{
"range": {
"availability": {
"gte": "2019-10-01",
"lt": "2019-10-02",
"relation": "intersects"
}
}
}
]
}
}
}结果:主机A从上午7点到中午12点,下午1时至4pm =>
{
"_index" : "hosts",
"_type" : "_doc",
"_id" : "IjOggG0BzetAdRPqckxN",
"_score" : 0.0,
"_source" : {
"name" : "A",
"availability" : {
"gte" : "2019-10-01T07:00:00.000Z",
"lte" : "2019-10-01T12:00:00.000Z"
}
}
},
{
"_index" : "hosts",
"_type" : "_doc",
"_id" : "IzOggG0BzetAdRPqckxN",
"_score" : 0.0,
"_source" : {
"name" : "A",
"availability" : {
"gte" : "2019-10-01T13:00:00.000Z",
"lte" : "2019-10-01T16:00:00.000Z"
}
}
}https://stackoverflow.com/questions/58107486
复制相似问题