es查詢

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"
      }
    }
  ]
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章