使用ES的快速實現內容相似性推薦

問答系統:通過用戶給出的一段描述性文本,通過相似度計算查找與用戶輸入接近的問題
相似推薦:用戶在瀏覽當前文章時,基於內容相似性推薦與本篇文章相似的文章

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。

 

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