1、商品分詞匹配,需要按狀態未成交的在前,已成交的在後
藉助_score通過sort實行。按照topic_status升序,_score降序排列
{
"_score":{
"order": "desc"
}
}
完整示例:
POST index/type/_search{ "query": { "bool": { "must":[{ "terms": { "topic_id": [41647, 161603, 192737, 371322, 573438, 214385, 296739, 218122, 189409, 522216 ] } }, { "multi_match": { "query": "微波爐", "fields": ["topic_titile^10", "topic_abstract"] } } ] } }, "_source": ["topic_id", "topic_title", "topic_abstract", "topic_status"], "sort": [ { "topic_status": { "order": "asc" } }, { "_score":{ "order": "desc" } } ]}
2、商品搜索,優先展示最近一個月的商品,越久的商品優先級越低,是按時間段來處理,而不是簡單的topic_ctime desc。
1個月> 2個月 > 3個月> 半年> 1年> 其他
還要考慮未成交的>已成交的,分詞匹配的分數。
(1)通過java語言將topic_ctime轉換爲不同的時間段數字
(2)query查詢的結果是script_field和sort的輸入。doc只能在_search中使用,其他情況使用ctx
(3)es腳本默認是painless,完美支持java
POST index/type/_search
{
"query": {
"bool": {
"must": [
{
"terms": {
"topic_id": [
41647,
161603,
192737,
371322,
573438,
214385,
296739,
218122,
189409,
522216
]
}
},
{
"multi_match": {
"query": "微波爐",
"fields": [
"topic_titile^10",
"topic_abstract"
]
}
}
]
}
},
"_source": [
"topic_id",
"topic_title",
"topic_abstract",
"topic_status",
"topic_ctime"
],
"sort": [
{
"topic_status": {
"order": "asc"
}
},
{
"_script": {
"type": "number",
"script": {
"inline": "int topicCtimeRange = -1;\n\t\tlong timeMillis = doc['topic_ctime'].value * 1000;\n\t\tCalendar c = Calendar.getInstance();\n\t\tc.add(Calendar.MONTH, -1);\n\t\tlong oneMonthTimeMilli = c.getTimeInMillis();\n\t\tc.add(Calendar.MONTH, -1);\n\t\tlong twoMonthTimeMilli = c.getTimeInMillis();\n\t\tc.add(Calendar.MONTH, -1);\n\t\tlong threeMonthTimeMilli = c.getTimeInMillis();\n\t\tc.add(Calendar.MONTH, -3);\n\t\tlong halfYearTimeMilli = c.getTimeInMillis();\n\t\tc.add(Calendar.MONTH, -6);\n\t\tlong oneYearTimeMilli = c.getTimeInMillis();\n\t\tif (timeMillis >= oneMonthTimeMilli) {\n\t\t\ttopicCtimeRange =10;\n\t\t}\n\t\telse if (timeMillis >= twoMonthTimeMilli) {\n\t\t\ttopicCtimeRange = 9;\n\t\t}\n\t\telse if (timeMillis >= threeMonthTimeMilli) {\n\t\t\ttopicCtimeRange = 8;\n\t\t}\n\t\telse if (timeMillis >= halfYearTimeMilli) {\n\t\t\ttopicCtimeRange = 7;\n\t\t}\n\t\telse if (timeMillis >= oneYearTimeMilli) {\n\t\t\ttopicCtimeRange = 6;\n\t\t}\n\t\telse {\n\t\t\ttopicCtimeRange = 0;\n\t\t}"
},
"order": "desc"
}
},
{
"_score": {
"order": "desc"
}
}
]
}