首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

ElasticSearch Java API 實現 More Like This 內容推薦:三種查詢構建方式與核心參數調優指南

     編輯:Java 綜合教學

ElasticSearch Java API 實現 More Like This 內容推薦

基於內容的推薦核心是「以文尋文」。Elasticsearch 封裝了 Lucene MoreLikeThis,提供三種 Java API 調用方式,本文詳細對比並列舉所有可調參數。

基礎查詢 DSL

{
  "more_like_this": {
    "fields": ["title", "content"],
    "like_text": "text like this one"
  }
}
  • fields:匹配字段,默認 _all
  • like_text:直接提供文本(不需現有文檔 ID)

核心調優參數

參數默認值說明
percent_terms_to_match0.3匹配詞項百分比
min_term_freq2單文檔詞最小頻次,過濾低頻噪聲
max_query_terms25查詢最大詞項數,控制性能
stop_words-停用詞集合
min_doc_freq0詞項最小文檔頻次,過濾過於常見詞
max_doc_freq無限制詞項最大文檔頻次,過濾停用詞
min_word_len0最小詞長
max_word_len無限制最大詞長
boost_terms1.0詞項權重提升
boost1.0整體查詢權重
analyzer字段映射指定分詞器,默認使用字段映射的

三種 Java API 調用方式

方式一:MoreLikeThisRequestBuilder(基於現有文檔 ID)

MoreLikeThisRequestBuilder mlt = new MoreLikeThisRequestBuilder(client, "index", "type", "docId");
mlt.setField("title");
mlt.setField("content");
mlt.setMinTermFreq(1);
mlt.setMaxQueryTerms(12);
SearchResponse response = client.moreLikeThis(mlt.request()).actionGet();
  • 直接在 client 上調用 moreLikeThis()
  • 適合「推薦與此文檔相似的文檔」場景

方式二:MoreLikeThisQueryBuilder(基於文本,完整參數控制)

MoreLikeThisQueryBuilder query = QueryBuilders.moreLikeThisQuery()
    .fields("title", "content")
    .likeText("用戶輸入或文檔摘要")
    .minTermFreq(1)
    .maxQueryTerms(12)
    .percentTermsToMatch(0.3f)
    .boost(1.0f);

SearchResponse response = client.prepareSearch("index")
    .setTypes("type")
    .setQuery(query)
    .get();
  • 鏈式調用,所有參數均有對應 setter
  • 可組合進 BoolQuery 等複雜查詢

方式三:MoreLikeThisFieldQueryBuilder(單字段簡化版)

MoreLikeThisFieldQueryBuilder query = QueryBuilders.moreLikeThisFieldQuery("content")
    .likeText("文本")
    .minTermFreq(1);
  • 構造時指定單一字段
  • 內部委託給 MoreLikeThisQueryBuilder

選型建議

場景推薦方式
已有文檔 ID,需推薦相似文檔方式一
無文檔 ID,基於用戶輸入/臨時文本推薦方式二
單字段匹配,參數極簡方式三
需組合其他查詢條件(如過濾分類、時間)方式二 + BoolQueryBuilder

最佳實踐提示

  1. like_text 文本應經過同樣分詞器處理,或直接傳入分析後的詞項
  2. 大規模索引建議設置 max_query_terms 限制查詢擴展規模
  3. 結合 min_doc_freq/max_doc_freq 過濾無區分度詞項
  4. 中文場景必須指定 analyzer(如 ik_smart/ik_max_word)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved