1. 程式人生 > >分散式搜尋elasticsearch java API 之(八)------使用More like this實現基於內容的推薦

分散式搜尋elasticsearch java API 之(八)------使用More like this實現基於內容的推薦

基於內容的推薦通常是給定一篇文件資訊,然後給使用者推薦與該文件相識的文件。Lucene的api中有實現查詢文章相似度的介面,叫MoreLikeThis。Elasticsearch封裝了該介面,通過Elasticsearch的More like this查詢介面,我們可以非常方便的實現基於內容的推薦。

先看一個查詢請求的json例子:

{ 
    "more_like_this" : { 
        "fields" : ["title", "content"], 
        "like_text" : "text like this one", 
    } 
}
其中:

fields是要匹配的欄位,如果不填的話預設是_all欄位

like_text是匹配的文字。

除此之外還可以新增下面條件來調節結果

percent_terms_to_match:匹配項(term)的百分比,預設是0.3

min_term_freq:一篇文件中一個詞語至少出現次數,小於這個值的詞將被忽略,預設是2

max_query_terms:一條查詢語句中允許最多查詢詞語的個數,預設是25

stop_words:設定停止詞,匹配時會忽略停止詞

min_doc_freq:一個詞語最少在多少篇文件中出現,小於這個值的詞會將被忽略,預設是無限制

max_doc_freq:一個詞語最多在多少篇文件中出現,大於這個值的詞會將被忽略,預設是無限制

min_word_len:最小的詞語長度,預設是0

max_word_len:最多的詞語長度,預設無限制

boost_terms:設定詞語權重,預設是1

boost:設定查詢權重,預設是1

analyzer:設定使用的分詞器,預設是使用該欄位指定的分詞器

下面介紹下如何用java api呼叫,一共有三種呼叫方式,不過本質上都是一樣的,只不過是做了一些不同程度的封裝。

MoreLikeThisRequestBuilder mlt = new MoreLikeThisRequestBuilder(client, "indexName", "indexType", "id");
mlt.setField("title");//匹配的欄位
SearchResponse response = client.moreLikeThis(mlt.request()).actionGet();
這種是在查詢與某個id的文件相似的文件。這個介面是直接在client那呼叫的,比較特殊。還有兩種就是構造Query進行查詢
MoreLikeThisQueryBuilder query = QueryBuilders.moreLikeThisQuery();
query.boost(1.0f).likeText("xxx").minTermFreq(10);
這裡的boost、likeText方法完全和上面的引數對應的。下面這種就是把要匹配的欄位作為引數傳進來,引數和MoreLikeThisQueryBuilder是一樣的。
MoreLikeThisFieldQueryBuilder query = QueryBuilders.moreLikeThisFieldQuery("fieldNmae");


參考資料:http://www.searchtech.pro/articles/2013/02/16/1360971902049.html