elasticsearch MoreLikeThisQueryBuilder实例
分布式搜索elasticsearch java client:使用More like this实现基于内容的推荐
elasticsearch MoreLikeThisQueryBuilder查询主要实现对一句话相似文章的查询。
在推荐系统中,通常要用到与一篇文章相似度高的一组文章。在这里我们要用到
MoreLikeThisRequestBuilder moreLikeThis=new MoreLikeThisRequestBuilder(client,"cms","news","id");
moreLikeThis.setField("title","content")
.setSearchFrom(0)
.setSearchSize(5)
.execute()
.actionGet();
或:
SearchResponse searchResponse = client.prepareMoreLikeThis("cms", "news", "id")
.setField("title","content")
.setSearchFrom(searchParam.getFrom())
.setSearchSize(searchParam.getSize())
.execute()
.actionGet();
获取文章:
Float usetime = searchResponse.getTookInMillis()/1000f;
// 命中记录数
Long hits = searchResponse.getHits().totalHits();
for (SearchHit hit : searchResponse.getHits()) {
// 打分
Float score = hit.getScore();
// 文章id
Integer id = Integer.parseInt(hit.getSource().get("id").toString());
String title = hit.getSource().get("title").toString();
String content = hit.getSource().get("content").toString();
// 文章更新时间
Long updatetime = Long.parseLong(hit.getSource().get("updatetime").toString());
}
我们可以用elasticsearch MoreLikeThis做推荐功能。实例如下:
MoreLikeThisQueryBuilder more=new MoreLikeThisQueryBuilder("title","content","mobileTitle");
more.likeText(q).analyzer("ik");//q为查询字段
// more.likeText("长安福特").analyzer("ik").minTermFreq(2).maxQueryTerms(25);//q为查询字段
SearchRequestBuilder response= client.prepareSearch("memedianews")
.setTypes("memedianews")
.setQuery(more)
.setScroll(new TimeValue(60000))
// .addFields("id","fname")
// .addSort("_score", SortOrder.DESC)
// .addSort("updatetime", SortOrder.DESC)
// .addHighlightedField("fname")
// .setHighlighterEncoder("UTF-8")
// .setHighlighterPreTags("<em>")
// .setHighlighterPostTags("</em>")
.setFrom(0)
.setSize(10);
SearchResponse searchResponse = response.execute().actionGet();
this.printresult(searchResponse);
在使用下面的语句查询后,未显示结果。原来MoreLikeThisQueryBuilder 默认的minTermFreq最小为2,即一个term最少应该出现2次
/**
* The frequency below which terms will be ignored in the source doc. The default
* frequency is <tt>2</tt>.
*/
public MoreLikeThisQueryBuilder minTermFreq(int minTermFreq) {
this.minTermFreq = minTermFreq;
return this;
}
最大的maxQueryTerms默认为25,根据自己需求修改。
/**
* Sets the maximum number of query terms that will be included in any generated query.
* Defaults to <tt>25</tt>.
*/
public MoreLikeThisQueryBuilder maxQueryTerms(int maxQueryTerms) {
this.maxQueryTerms = maxQueryTerms;
return this;
}
将上述代码中修改为:
more.likeText(q).analyzer("ik").minTermFreq(1).maxQueryTerms(25);
转载 : http://www.chepoo.com/tag/code-example