分散式搜尋elasticsearch java API 之(八)------使用More like this實現基於內容的推薦
阿新 • • 發佈:2019-02-11
基於內容的推薦通常是給定一篇文件資訊,然後給使用者推薦與該文件相識的文件。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呼叫,一共有三種呼叫方式,不過本質上都是一樣的,只不過是做了一些不同程度的封裝。
這種是在查詢與某個id的文件相似的文件。這個介面是直接在client那呼叫的,比較特殊。還有兩種就是構造Query進行查詢MoreLikeThisRequestBuilder mlt = new MoreLikeThisRequestBuilder(client, "indexName", "indexType", "id"); mlt.setField("title");//匹配的欄位 SearchResponse response = client.moreLikeThis(mlt.request()).actionGet();
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