【问题标题】:Elastic search - Searching for asset availibilityElasticsearch - 搜索资产可用性
【发布时间】:2012-10-04 13:19:57
【问题描述】:

我想知道是否有办法使用弹性搜索来进行查询,只返回在特定日期范围内可用的对象?如何构造数据?

我需要的是查询一个给出开始和结束日期的数据库,并查找在开始日期和结束日期之间的整个持续时间内在该期间可用的所有对象?

{object-available:
{
{start:'01/01/2012', end:'03/02/2012'},
{start:'05/05/2012', end:'31/12/2012'}
}

搜索 2012 年 1 月 1 日至 2012 年 1 月 15 日之间可用的对象应返回此对象, 但搜索 01/03/2012 - 01/04/2012 不应返回。

【问题讨论】:

  • 你有没有尝试过但没有成功?你试过什么?

标签: lucene elasticsearch


【解决方案1】:

可以将可用性范围存储为Nested Objects,然后使用Nested QueryFilter 检查开始日期和结束日期是否都在所需的日期范围内。您可以使用Bool Query 和两个包含Date Range Queries 的必须子句来执行此检查。例如:

# Delete old version to make sure new settings are applied
curl -XDELETE "localhost:9200/dates-test/"
echo
# Create a new index with proper mapping 
# See http://www.elasticsearch.org/guide/reference/index-modules/analysis/pathhierarchy-tokenizer.html
curl -XPUT "localhost:9200/dates-test" -d '{
    "mappings": {
        "doc": {
            "properties": {
                "name": {"type": "string"},
                "object-available": {
                    "type": "nested",
                    "properties" : {
                        "end" : {
                            "type" : "date"
                        },
                        "start" : {
                            "type" : "date"
                        }
                    }
                }
            }
        }
    }
}'
echo
# Put some test data
curl -XPUT "localhost:9200/dates-test/doc/1" -d '{
    "name": "Record 1",
    "object-available":[
        {"start":"2012-01-01", "end":"2012-02-03"},
        {"start":"2012-05-05", "end":"2012-12-31"}
    ]
}
'
curl -XPUT "localhost:9200/dates-test/doc/2" -d '{
    "name": "Record 2",
    "object-available":[
        {"start":"2012-02-01", "end":"2012-04-20"},
        {"start":"2012-04-25", "end":"2012-11-30"}
    ]
}
'
curl -XPOST "localhost:9200/dates-test/_refresh"
echo
echo Test for the range 2011-12-01 - 2012-02-05. Should find only 1st record 
curl -XPOST "localhost:9200/dates-test/doc/_search?pretty=true" -d '{
    "query": {
        "nested": {
            "path": "object-available",
            "query": {
                "bool": {
                    "must": [
                        {
                            "range": {
                                "start": {
                                    "from": "2011-12-01",
                                    "to": "2012-02-05"
                                }
                            }
                        },
                        {
                            "range": {
                                "end": {
                                    "from": "2011-12-01",
                                    "to": "2012-02-05"
                                }
                            }
                        }

                    ]
                }
            }
        }
    }
}'
echo
echo Test for the range 2012-01-20 - 2012-12-01. Should find only 2nd record 
curl -XPOST "localhost:9200/dates-test/doc/_search?pretty=true" -d '{
    "query": {
        "nested": {
            "path": "object-available",
            "query": {
                "bool": {
                    "must": [
                        {
                            "range": {
                                "start": {
                                    "from": "2012-01-20",
                                    "to": "2012-12-01"
                                }
                            }
                        },
                        {
                            "range": {
                                "end": {
                                    "from": "2012-01-20",
                                    "to": "2012-12-01"
                                }
                            }
                        }

                    ]
                }
            }
        }
    }
}'
echo
echo Test for the range 2012-04-01 - 2013-01-01. Should find both record 
curl -XPOST "localhost:9200/dates-test/doc/_search?pretty=true" -d '{
    "query": {
        "nested": {
            "path": "object-available",
            "query": {
                "bool": {
                    "must": [
                        {
                            "range": {
                                "start": {
                                    "from": "2012-04-01",
                                    "to": "2013-01-01"
                                }
                            }
                        },
                        {
                            "range": {
                                "end": {
                                    "from": "2012-04-01",
                                    "to": "2013-01-01"
                                }
                            }
                        }

                    ]
                }
            }
        }
    }
}'

【讨论】:

  • 我在想类似的事情,但不知道如何在实践中实现这一点,您可以给我一个例子吗?
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2021-04-21
  • 1970-01-01
  • 2013-12-07
  • 2015-03-22
相关资源
最近更新 更多