使用 man ascii 来查看 ASCII 表。

过期商品排序问题

Elasticsearch | 作者 haoshuai | 发布于2019年10月07日 | 阅读数:2405

我有一个需求是根据当前时间和es中商品的过期时间相减,判断商品是否过期。
再根据过期的商品和没有过期的商品进行排序,没过期的商品排在前面过期的商品排在后面,请求语句该怎么写?
已邀请:

doom

赞同来自: haoshuai

给你一个简单的案例参照:
PUT product2
{
"settings": {
"number_of_replicas": 0,
"number_of_shards": 1
},
"mappings": {
"properties": {
"name":{
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"product_date":{
"type": "date",
"format": ["yyyy-MM-dd"]
},
"guarantee":{
"type": "integer"
}
}
}
}
插入数据插入插入数据数据

PUT product2/_doc/_bulk
{"index":{"_id":1}}
{"name":"饼干","product_date":"2019-01-11","guarantee":180}
{"index":{"_id":2}}
{"name":"月饼","product_date":"2019-01-11","guarantee":200}
{"index":{"_id":3}}
{"name":"牛奶","product_date":"2019-01-11","guarantee":280}
{"index":{"_id":4}}
{"name":"鸡蛋","product_date":"2019-02-11","guarantee":180}
{"index":{"_id":5}}
{"name":"小麦","product_date":"2019-03-11","guarantee":180}
{"index":{"_id":6}}
{"name":"大米","product_date":"2019-04-11","guarantee":180}
{"index":{"_id":7}}
{"name":"酱油","product_date":"2019-06-11","guarantee":180}

查询查询查询
GET product2/_search
{
  "query": {
    "match_all": {}
  },
  "sort": {
    "_script": {
      "script": {
        "lang": "painless",
        "source": "((new Date()).getTime() - doc['product_date'].value.millis)/86400000.0 - doc['guarantee'].value"
      },
      "type": "number",
      "order": "asc"
    }
  }
}
大概的意思: 现在的时间 - 生成日期来获取 产品存在天数,再减去过期时间的天数,就可以获取产是否过期的数据;>0就为过期;
<=0,

trycatchfinal

赞同来自: haoshuai

建议在每天的非热门查询时间,比如凌晨,重新计算产品是否过期,并保存结果。
使用script,每次都要进行计算,数据量大的话,会有性能问题。
 
根据具体查询,选择合适的索引类型。
如果需要进行排序,可以创建一个integer类型的field,过期可以设置为-1;
如果查询所有过期的查询,可以再建立一个boolean类型的field,使用term查询,虽然查询“过期时间>0”也能实现,但是效率不如term查询。
--------------------------------------------------
还有一种办法:
通过“生产日期”和“保质期”是可以计算出“过期日期”的。
在索引数据时,同时索引“过期日期”字段。
对“过期日期”进行倒序,就可以将过期的产品靠后排序了。

caizhongao

赞同来自: haoshuai

知道生产日期和保质期,不是可以直接算出过期的日期吗,在索引的时候把过期日期一起存进去就好,然后查询时候根据过期日期倒序

要回复问题请先登录注册