2015-03-03 21 views
3

我想用流行度提高文檔的得分。我希望它儘可能實時。通過elasticsearch實時比分的人氣評分替代品

爲了滿足實時性要求,似乎每次文檔的流行度變化(每個視圖)時都必須對每個文檔重新編制索引。這看起來非常低效。

另一種方法是運行一個批處理過程,該過程會定期重新索引最近查看過的文檔,但這變得不那麼實時,並且仍然需要在只有一個字段(流行度)發生變化時重新索引整個文檔。

第三種方法(我們已經實現)是使用插件從外部源獲取文檔的流行度,並使用腳本將其包含在評分中。這也適用,但會減慢大文檔空間的搜索速度。使用rescore有幫助,但它只允許我們對返回的文檔的一個子集進行排序。

是否有更好的選擇(將索引添加到索引而不重新索引整個文檔或更好的方式來將外部數據與彈性搜索集成)?

回答

0

我們實施了第二種和第三種方法的混合。我們有一個外部來源(在我們的案例中是一個數據庫),它存儲了文檔ID的流行值以及所有關於受歡迎程度的查詢。另外我們有一個cron,每隔一小時通過重新索引來更新所有文檔。我們重新編制索引的原因是因爲我們對需要新受歡迎程度的文檔進行了其他分析,但從技術上講,您只能擁有數據庫,因爲它可以滿足所有請求目的。

當涉及到文檔ID的數字檢索時,數據庫比單純搜索/ lucene/solr快得多。希望這可以幫助。

1

您可以嘗試以下操作以獲得實時流行度字段。

  1. 包括熱門領域作爲您的索引的一部分。

  2. 每次檢索文檔時遞增流行度。您可以使用部分更新腳本執行此操作。

  3. 使用函數分數查詢來提升文檔。

的Java API:

new FunctionScoreQueryBuilder(matchQuery("canonical_name", 
           phrase).analyzer("standard") 
           .minimumShouldMatch("100%")).add(
           fieldValueFactorFunction("popularityScore") 
             .modifier(Modifier.LOG1P).factor(2f)) 
           .boostMode("sum")) 

http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/boosting-by-popularity.html