2017-01-18 124 views
0

在用Elasticsearch製作的搜索引擎中,考慮用戶點擊結果項目以改善用戶印象較多的文檔的得分,最佳解決方案是什麼?Elasticsearch用戶點擊反饋

是否有任何工具或插件可以使用或應該從頭開始寫?

溶液預期考慮以下作爲谷歌確實:

  • 的次數每個文檔已經顯示
  • 次數一個用戶點擊
  • 查詢該用戶文檔找遍(文檔可能在某個特定查詢重要的,但在別人不重要)
  • ...
+0

您希望ES瞭解點擊次數?不可能,這是你需要在你的系統中實現的東西,稍後將向ES提交一些點擊數據作爲提升/埋沒值 – Mysterion

+0

我知道我的系統應該將點擊數據提交給elasticsearch。我的問題是我如何使彈性搜索考慮這個日誌數據作爲包含查詢和結果點擊的評分公式的一部分。它不像提高文檔那麼簡單.. –

+1

是的,這並不簡單,但一些簡單的特設可以實現,如基於某些公式的查詢時間提升let say score = initial_score + clicksw * shows或其他什麼 – Mysterion

回答

2

如果您使用rails/ruby​​開發您的API,您可以通過使用搜索解決方案更加智能,每天更多的使用來查看幾乎完成這項工作的searchkick

現在,如果你不在軌道上或者你想開發自己的內部實現,這裏有幾點關於我的架構的建議。

讓我們先從基本概述,關鍵模塊,缺點以及適應解決方案中這些缺點的體系結構開始。

則需要

1)計分算法,其中可以定義一個方程,這將產生用於每個文檔得分的公式。 讓我們考慮你提到的參數

a)每個文檔已被顯示的次數 b)文件被點擊的次數。 c)查詢哪個文檔被搜索。

現在,因爲您尚未提及a)和b)如何適合當前情況。我會假設一個更簡單的,但如果你想建立一個真正先進的智能解決方案,我也會結合a)b)和c)。例如 - 文檔出現給定關鍵字的次數。就像我尋找「雪地靴」時,應該考慮這個(出現次數/點擊次數),只是當查詢或多或少像「雪地靴」不適合所有情況。其中「雪地靴」可以用關鍵字順序逼近的下列元素分解爲關鍵字。

{ 
    "keyword": "snow", 
    "document_ids": [3, 5, 6, 8], 
    "document_ids_views": [{ 
     "doc_id": 3, 
     "views ": 110, 
     "clicks": 560 
    }, { 
     "doc_id": 5, 
     "views": 100, 
     "clicks": 78 
    }, { 
     "doc_id": 6, 
     "views": 100, 
     "clicks": 120 
    }, { 
     "doc_id": 3, 
     "views": 100, 
     "clicks": 465 
    }] 
} 

{ 
    "keyword": "boots", 
    "document_ids": [3, 5, 6, 8], 
    "document_ids_views": [{ 
     "doc_id": 3, 
     "views ": 100, 
     "clicks": 56 
    }, { 
     "doc_id": 5, 
     "views": 100, 
     "clicks": 78 
    }, { 
     "doc_id": 6, 
     "views": 100, 
     "clicks": 120 
    }, { 
     "doc_id": 3, 
     "views": 100, 
     "clicks": 465 
    }] 
} 

以上是存儲在單獨數據庫中的每個關鍵字的彙總數據。

像這樣,我會建立一個統計數據的元數據在一個單獨的數據存儲讓我們說mongo。如果我已經有「雪」在我的元和新的查詢與這個關鍵字我會更新相同的元文檔。

現在我想討論一下不足,以及爲什麼我選擇將它們保存在單獨的數據庫中,而不是將它們追加到elasticsearch文檔中。

我不想每次彈出一個新的查詢來更新彈性文檔中的點擊次數和瀏覽次數時,通過elasticsearch集羣來錘擊,因爲我知道更新非常I/O,並且有倒排索引合併。

現在爲了彌補這個缺點,我會每天或每日批量作業將這些元信息以彈性方式移植到每個文檔中。我會用這個新的元信息重建整個集羣,並將別名從舊索引移動到新索引,而不會有任何停機時間。

現在要將此信息關聯或添加到彈性文檔中,我將使用parent-child documents relationship來映射具有與此關聯的關鍵字的彈性文檔。

所以我的基本父文件和子文件可以像

父文檔

PUT /index/type/3 
{ 
    "name": "Reebok shoes", 
    "category": "snow boots", 
    "price": 120 
} 

子文檔

PUT /index/type_meta/1?parent=3 


    { 
    "keyword": "boots", 
    "document_id": 3, 
    "doc_id": 3, 
    "views ": 100, 
    "clicks": 56 
} 

PUT /index/type_meta/1?parent=3 


{ 
    "keyword": "snow", 
    "document_id": 3, 
    "doc_id": 3, 
    "views ": 110, 
    "clicks": 560 
} 

以上親子文件幾乎解釋我在如何建立每個文檔的搜索統計數據元。

到現在爲止,我們已經構建了一個非常聰明的解決方案來收集搜索統計數據的事件數據,併成功地將它們與每個文檔進行彈性關聯。

讓我們開始尋找得分查詢這裏 -

我不會深入在這裏設計了得分算法中,但我會去更傾向於執行那些能得分根據意見文件的查詢,點擊相關與關鍵字和關鍵字的相關性。

Function score query

Script score

現在,我可能會選擇給予更多的權重,以在名稱匹配比的類別。這就是從你的用例角度來看,我不會爲你設計分數公式。

{ 
    "query": { 
     "function_score": { 
      "query": { 
       "match_all": {} 
      }, 
      "boost": "5", 
      "functions": [{ 
       "filter": { 
        "match": { 
         "name": "snow" 
        } 
       }, 
       "random_score": {}, 
       "weight": 200 
      }, { 
       "filter": { 
        "match": { 
         "name": "boots" 
        } 
       }, 
       "weight": 200 
      }, { 
       "filter": { 
        "match": { 
         "category": "snow" 
        } 
       }, 
       "random_score": {}, 
       "weight": 100 
      }, { 
       "filter": { 
        "match": { 
         "category": "boots" 
        } 
       }, 
       "weight": 100 
      }, { 
       "filter": { 
        "query": { 
         "has_parent": { 
          "type": "type_meta", 
          "query": { 
           "match": { 
            "keyword": "snow" 
           } 
          } 
         } 
        } 
       }, 
       "script_score": { 
        "script": { 
         "lang": "painless", 
         "inline": "_score + 20*doc['clicks'].value + 40 * doc['views].value" 
        } 
       } 
      }, { 
       "filter": { 
        "query": { 
         "has_parent": { 
          "type": "type_meta", 
          "query": { 
           "match": { 
            "keyword": "boots" 
           } 
          } 
         } 
        } 
       }, 
       "script_score": { 
        "script": { 
         "lang": "painless", 
         "inline": "_score + 20*doc['clicks'].value + 40 * doc['views].value" 
        } 
       } 
      }], 

      "score_mode": "max", 
      "boost_mode": "multiply" 
     } 
    } 
} 

所以,你可以使用呈三角像上面的查詢,我剛纔已經選擇了與演示升壓PARAMS一個非常簡單的公式,每個子句,該查詢可以furthur的實現提前得分算法中進行重構。

腳本分數功能在這裏很重要,因爲我首先根據單個父文檔的搜索關鍵字篩選子文檔,然後使用腳本分數來使用點擊和查看計數來影響我的總體文檔分數。

現在,這是一種我期待在我的項目中實現的解決方案,我願意爲我的解決方案提供建議和改進。

請分享您的建議和改進。

希望這會有所幫助 謝謝

+0

感謝您的分享。 –