問答系統:通過用戶給出的一段描述性文本,通過相似度計算查找與用戶輸入接近的問題
相似推薦:用戶在瀏覽當前文章時,基於內容相似性推薦與本篇文章相似的文章
more_like_this顧名思義就是幫我找到更多像這個文檔的數據,爲了便於講解,這裏先構建一個索引庫,該索引庫包含title和desc兩個字段:
PUT /search_data
{
"mappings": {
"properties": {
"title": {
"type": "text",
"term_vector": "yes"
},
"desc": {
"type": "text"
}
}
}
}
- term_vector
term_vector爲yes時會索引terms向量,加快相似度計算的速度;這裏desc字段沒有配置term_vector也是可以進行more_like_this查詢的,但會有性能損耗,這裏不配置是爲了更好的說明問題,到線上應用需要都設置爲yes。
基於一段短文本或一個問題描述語句進行推薦
GET /_search
{
"query": {
"more_like_this" : {
"fields" : ["title", "desc"],
"like" : "清明節春遊踏青春季旅遊學校春遊親子游企業郊遊活動",
"min_term_freq" : 1,
"max_query_terms" : 12
}
}
}
- fields
要執行查詢的字段,目前只支持text和term - like
要查詢相似的文本,可以是文檔id或者一個查詢字句 - min_term_freq
最小詞頻率,低於該頻率的詞將被忽略 - max_query_terms
根據max_query_terms配置的數,提取like中文本term的tfidf值最大的幾個,其餘的詞將被忽略
另外如果文本太長,也可以基於文章Id進行相似推薦
GET /_search
{
"query": {
"more_like_this" : {
"fields" : ["title", "desc"],
"like" : [
{
"_index" : "search_data",
"_id" : "1"
}
],
"min_term_freq" : 1,
"max_query_terms" : 12
}
}
}
like後面是數組可以跟多篇文章,另外_index對應的索引庫也可以不是當前查詢的索引庫。
結果微調
- unlike
如果對推薦的結果不是很滿意,也可以通過unlike參數進行微調,使用方式和like一致,不同的是這裏傳入的是你不喜歡的一些內容,在進行相似性計算時進行降權,需要注意的是,這裏如果降權的是頭部推薦的話不是很明顯。
GET search_data/_search
{
"size": 112,
"_source": ["desc","title"],
"query": {
"more_like_this" : {
"fields" : ["title", "desc"],
"unlike":[
{
"_index" : "search_data",
"_id" : "1270715"
},
{
"_index" : "search_data",
"_id" : "1238991"
},
{
"_index" : "search_data",
"_id" : "506680"
},
"我要把不喜歡的內容屏蔽掉"
],
"like" : [
{
"_index" : "search_data",
"_id" : "986604"
}
],
"min_term_freq" : 1
}
}
}
其它可選參數
- min_doc_freq:最小的文檔頻率,默認爲5。
- max_doc_freq:最大文檔頻率。
- min_word_length:單詞的最小長度。
- max_word_length:單詞的最大長度。
- stop_words:停用詞列表。
- analyzer:分詞器。
- minimum_should_match:文檔應該匹配的最小單詞數量,默認爲query分詞後詞項的30%。
- boost_terms:詞項的權重。
- include:是否把輸入文檔作爲結果返回。
- boost:整個query的權重,默認爲1.0。