影響召回 & 影響排序

導語

比如用戶索索“住宿”逊桦,但是沒有一家酒店的名字中包含住宿柜思,然后給用戶返回了一個空白頁。除了給“住宿”添加同義詞“酒店”外 写隶,這個問題還可以這樣解決:為每一個 catetory_id 維護一組關鍵詞玫氢,這組關系維護在一個 Map 中帚屉,當一個 keyword 進入 Service 層后,先 Analyze 它漾峡,得到的 token 去 Map 中查找對應的 category_id涮阔,然后可以將這個 category_id 放在 Query 里影響召回,也可以放在 filter 中影響排序灰殴。一般的做法是:先影響排序敬特,如果得不到結果,再影響召回牺陶;


category_id 和關鍵詞的映射

// category_id 下的所有關鍵詞
    private Map<Integer,List<String>> categoryWorkMap = new HashMap<>();

@PostConstruct
public void init(){
    categoryWorkMap.put(1,new ArrayList<>());
    categoryWorkMap.put(2,new ArrayList<>());

    categoryWorkMap.get(1).add("吃飯");
    categoryWorkMap.get(1).add("下午茶");

    categoryWorkMap.get(2).add("休息");
    categoryWorkMap.get(2).add("睡覺");
    categoryWorkMap.get(2).add("住宿");
}

查詢 keyword 對應的 category_id

/**
 * GET /shop/_analyze
 * {
 *   "field": "name",
 *   "text": "凱悅"
 * }
 * 先分詞 Keyword伟阔,再看分詞后的每個 token 是否對應了某個 category_id,最后將每個 token 對應哪個 category_id 返回出來掰伸;
 * @param keyword
 * @return
 * @throws IOException
 */
private Map<String,Object> analyzeCategoryKeyword(String keyword) throws IOException {
    Map<String,Object> res = new HashMap<>();

    Request request = new Request("GET","/shop/_analyze");
    request.setJsonEntity("{" + "  \"field\": \"name\"," + "  \"text\":\"" + keyword + "\"\n" + "}");
    Response response = highLevelClient.getLowLevelClient().performRequest(request);
    String responseStr = EntityUtils.toString(response.getEntity());
    JSONObject jsonObject = JSONObject.parseObject(responseStr);
    JSONArray jsonArray = jsonObject.getJSONArray("tokens");
    for(int i = 0; i < jsonArray.size(); i++){
        String token = jsonArray.getJSONObject(i).getString("token");
        Integer categoryId = getCategoryIdByToken(token);
        if(categoryId != null){
            res.put(token, categoryId);
        }
    }

    return res;
}

private Integer getCategoryIdByToken(String token){
    for(Integer key : categoryWorkMap.keySet()){
        List<String> tokenList = categoryWorkMap.get(key);
        if(tokenList.contains(token)){
            return key;
        }
    }
    return null;
}

影響召回的 Query DSL

  • 使用 bool 查詢的 should 子句皱炉;
GET /shop/_search 
{
  "_source": "*",
  "script_fields": {
    "distance": {
      "script": {
        "source": "haversin(lat,lon,doc['location'].lat,doc['location'].lon)",
        "lang": "expression",
        "params": {"lat":31.23916171,"lon":121.48789949}
      }
    }
  },
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {"match": {"name": {"query": "住宿","boost": 0.1}}},
                  {"term":{"category_id":2}}
                ]
              }
            },
            {"term": {"seller_disabled_flag": 0}}
          ]
        }
      },
      "functions": [
        {
          "gauss": {
            "location": {
              "origin": "31.23916171,121.48789949",
              "scale": "100km",
              "offset": "0km",
              "decay": 0.5
            }
          },
          "weight": 9
        },
        {
          "field_value_factor": {
            "field": "remark_score"
          },
          "weight": 0.2
        },
        {
          "field_value_factor": {
            "field": "seller_remark_score"
          },
          "weight": 0.1
        }
      ],
      "score_mode": "sum",
      "boost_mode": "sum"
    }
  },
  "sort": [ 
    {
      "_score": {
        "order":"desc"
      }
    }
  ]
}

影響排序的 Query DSL

  • 在 Function Query 的 Function 中添加一個 filer:
GET /shop/_search 
  {
    "_source": "*",
    "script_fields": {
      "distance": {
        "script": {
          "source": "haversin(lat,lon,doc['location'].lat,doc['location'].lon)",
          "lang": "expression",
          "params": {"lat":31.23916171,"lon":121.48789949}
        }
      }
    },
    "query": {
      "function_score": {
        "query": {
          "bool": {
            "must": [
              {
                "bool": {
                  "should": [
                    {"match": {"name": {"query": "住宿","boost": 0.1}}}
                  ]
                }
              },
              {"term": {"seller_disabled_flag": 0}}
            ]
          }
        },
        "functions": [
          {
            "gauss": {
              "location": {
                "origin": "31.23916171,121.48789949",
                "scale": "100km",
                "offset": "0km",
                "decay": 0.5
              }
            },
            "weight": 9
          },
          {
            "field_value_factor": {
              "field": "remark_score"
            },
            "weight": 0.2
          },
          {
            "field_value_factor": {
              "field": "seller_remark_score"
            },
            "weight": 0.1
          },
          {
            "filter": {"term":{"category_id": 2}},
            "weight": 0.2
          }
        ],
        "score_mode": "sum",
        "boost_mode": "sum"
      }
    },
    "sort": [ 
      {
        "_score": {
          "order":"desc"
        }
      }
    ]
  }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市狮鸭,隨后出現的幾起案子合搅,更是在濱河造成了極大的恐慌,老刑警劉巖歧蕉,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灾部,死亡現場離奇詭異,居然都是意外死亡惯退,警方通過查閱死者的電腦和手機赌髓,發(fā)現死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锁蠕,你說我怎么就攤上這事夷野。” “怎么了荣倾?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵悯搔,是天一觀的道長。 經常有香客問我舌仍,道長妒貌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任抡笼,我火速辦了婚禮苏揣,結果婚禮上黄鳍,老公的妹妹穿的比我還像新娘推姻。我一直安慰自己,他們只是感情好框沟,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布藏古。 她就那樣靜靜地躺著,像睡著了一般忍燥。 火紅的嫁衣襯著肌膚如雪拧晕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天梅垄,我揣著相機與錄音厂捞,去河邊找鬼。 笑死队丝,一個胖子當著我的面吹牛靡馁,可吹牛的內容都是我干的。 我是一名探鬼主播机久,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼臭墨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了膘盖?” 一聲冷哼從身側響起胧弛,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侠畔,沒想到半個月后结缚,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡软棺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年掺冠,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡德崭,死狀恐怖斥黑,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情眉厨,我是刑警寧澤锌奴,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站憾股,受9級特大地震影響鹿蜀,放射性物質發(fā)生泄漏。R本人自食惡果不足惜服球,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一茴恰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斩熊,春花似錦往枣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至霸株,卻和暖如春雕沉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背去件。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工坡椒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尤溜。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓倔叼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親靴跛。 傳聞我的和親對象是個殘疾皇子缀雳,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348