Lucene利用MoreLikeThis实现"你可能感兴趣的"搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene利用MoreLikeThis实现"你可能感兴趣的"搜索相关的知识,希望对你有一定的参考价值。

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queries.mlt.MoreLikeThis;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;

import dev.lzq.search.lucene4x.commons.Manager;

public class TestMoreLikeThisQuery 
{
	public static void main(String[] args) throws IOException 
	{
		IndexReader reader = Manager.getIndexReader();
		IndexSearcher searcher = Manager.getIndexSearcher();
		
		int refDocId = 1;
		Document refDoc = searcher.doc(refDocId);
		System.out.println("关联文档: 【" + refDoc.get("Title") + "】" + refDoc.get("Introduction"));
		
		MoreLikeThis mlt = new MoreLikeThis(Manager.getIndexReader());
		mlt.setFieldNames(new String[]{"Search_Field_Title", "Introduction"});
		// 默认值是2,建议自己做限制,否则可能查不出结果  
		mlt.setMinTermFreq(1);
		// 默认值是5,建议自己做限制,否则可能查不出结果  
		mlt.setMinDocFreq(1);
		mlt.setAnalyzer(Manager.getAnalyzer());
		// query实际质上是BooleanQuery。
		//  MoreLikeThis的原理是根据你提供的参考Document 和 Fields, 利用Analyzer给该Document的Fileds做分词, 然后拼接BooleanQuery做Occur.SHOULD搜索
		Query query = mlt.like(refDocId);
		
		TopDocs tds = searcher.search(query, 10);
		ScoreDoc[] sds = tds.scoreDocs;
		for(ScoreDoc sd : sds)
		{
			Document doc = searcher.doc(sd.doc);
			System.out.println("相似文档: 【" + doc.get("Title") + "】 " + doc.get("Introduction"));
		}
	}
}

  其中,Manager类的代码我没贴出来, IndexReader, IndexSearcher, Analyzer其实就是普通的新建对象,没什么封装的东西。

本文出自 “DeaconLi” 博客,请务必保留此出处http://lizhuquan0769.blog.51cto.com/2591147/1789848

以上是关于Lucene利用MoreLikeThis实现"你可能感兴趣的"搜索的主要内容,如果未能解决你的问题,请参考以下文章

弹性搜索 MoreLikeThis 查询从不返回结果

Lucene实现索引和查询

Lucene查询语法汇总

全文检索引擎:solr lucene

利用solr实现商品的搜索功能

Lucene 时间排序