我想知道是否有办法使用弹性搜索来生成只返回特定日期范围内可用对象的查询?如何构建数据?
我需要的是查询给出开始和结束日期的数据库,并在开始和结束日期之间的整个持续时间内找到该时间段内可用的所有对象?
{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不应该退货。
答案 0 :(得分:2)
可以将可用性范围存储为Nested Objects,然后使用Nested Query或Filter检查开始日期和结束日期是否属于所需的日期范围。您可以使用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"
}
}
}
]
}
}
}
}
}'