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("測試").minTermFreq(10);
這裡的boost、likeText方法完全和上面的參數對應的。下面這種就是把要匹配的字段作為參數傳進來,參數和MoreLikeThisQueryBuilder是一樣的。
MoreLikeThisFieldQueryBuilder query = QueryBuilders.moreLikeThisFieldQuery("測試");