`

Lucene MoreLikeThisQuery 例子

阅读更多

 

要做一个跟文章标题相关的新闻,本来想简单做一下,就是把标题用分词处理一下,去除停用词,做个布尔查询,朋友建议lucene有一个 MoreLikeThisQuery,试了一下功能,觉得还可以,贴上示例代码 (MoreLikeThisQuery 在contrib 下的Queryies):

 

pom文件:

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>lucene-test</groupId>
	<artifactId>lucene-test</artifactId>
	<version>0.1-SNAPSHOT</version>
	<name>lucene-test</name>
	<dependencies>

		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-core</artifactId>
			<version>2.9.2</version>  <!-- 3.0.0 -->
		</dependency>

		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-queries</artifactId>
			<version>2.9.2</version>  <!-- 3.0.0 lucene-queries-2.9.2-dev.jar-->
		</dependency>


	</dependencies>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

 

 

Java文件:

 

package lucene.test;
import java.io.File;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.similar.MoreLikeThisQuery;
import org.apache.lucene.store.NIOFSDirectory;
import org.apache.lucene.util.Version;

//ref doc: 
//http://www.iteye.com/topic/586043
//http://www.cnblogs.com/forfuture1978/archive/2010/05/19/1738803.html
//http://www.javadocexamples.com/java_source/org/apache/lucene/xmlparser/builders/LikeThisQueryBuilder.java.html
	
public class LuceneTestLike {
	public static void main(String[] args) {   
        try{   
  
            String path = "./Index";   
            StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29) ; 
               
            boolean isIndex = false;    // true:要索引,false:表示要搜索    
               
            if(isIndex){
                IndexWriter writer = new IndexWriter(new NIOFSDirectory(new File(path)),analyzer,MaxFieldLength.LIMITED);   
                   
                Document doc_0 = new Document();   
                doc_0.add(new Field("Name","java 开发人员", Field.Store.YES, Field.Index.ANALYZED));   
                doc_0.add(new Field("Info","招聘 网站开发人员,要求一年或以上工作经验", Field.Store.YES, Field.Index.ANALYZED));   
                doc_0.add(new Field("Time","20100201", Field.Store.YES, Field.Index.NOT_ANALYZED));   
                writer.addDocument(doc_0);   
                   
                Document doc_1 = new Document();   
                doc_1.add(new Field("Name","高级开发人员(java 方向)", Field.Store.YES, Field.Index.ANALYZED));   
                doc_1.add(new Field("Info","需要有四年或者以上的工作经验,有大型项目实践,java基本扎实", Field.Store.YES, Field.Index.ANALYZED));   
                doc_1.add(new Field("Time","20100131", Field.Store.YES, Field.Index.NOT_ANALYZED));   
                writer.addDocument(doc_1);   
                   
                Document doc_2 = new Document();   
                doc_2.add(new Field("Name","php 开发工程师", Field.Store.YES, Field.Index.ANALYZED));   
                doc_2.add(new Field("Info","主要是维护公司的网站php开发,能独立完成网站的功能", Field.Store.YES, Field.Index.ANALYZED));   
                doc_2.add(new Field("Time","20100201", Field.Store.YES, Field.Index.NOT_ANALYZED));   
                writer.addDocument(doc_2);   
                   
                Document doc_3 = new Document();   
                doc_3.add(new Field("Name","linux 管理员", Field.Store.YES, Field.Index.ANALYZED));   
                doc_3.add(new Field("Info","管理及维护公司的linux服务器,职责包括完成mysql数据备份及日常管理,apache的性能调优等", Field.Store.YES, Field.Index.ANALYZED));   
                doc_3.add(new Field("Time","20100201", Field.Store.YES, Field.Index.NOT_ANALYZED));   
                writer.addDocument(doc_3);   
                   
                Document doc_4 = new Document();   
                doc_4.add(new Field("Name","lucene开发工程师", Field.Store.YES, Field.Index.ANALYZED));   
                doc_4.add(new Field("Info","需要两年或者以上的从事lucene java 开发工作的经验,需要对算法,排序规则等有相关经验,java水平及基础要扎实", Field.Store.YES, Field.Index.ANALYZED));   
                doc_4.add(new Field("Time","20100131", Field.Store.YES, Field.Index.NOT_ANALYZED));   
                writer.addDocument(doc_4);   
                   
                Document doc_5 = new Document();   
                doc_5.add(new Field("Name","php 软件工程师", Field.Store.YES, Field.Index.ANALYZED));   
                doc_5.add(new Field("Info","具有大量的php开发经验,如熟悉 java 开发,数据库管理则更佳", Field.Store.YES, Field.Index.ANALYZED));   
                doc_5.add(new Field("Time","20100130", Field.Store.YES, Field.Index.NOT_ANALYZED));   
                writer.addDocument(doc_5);   
                   
                writer.close();   
                System.out.println("数据索引完成");   
            }else{   
                IndexSearcher search = new IndexSearcher(new NIOFSDirectory(new File(path)),true);   
                
                String kw="php 开发工程师" ; //"lucene java"; //"开发工程师"; //"php 开发工程师";
                
                String[] moreLikeFields = { "Name"} ; //{ "Name" ,"Info"};
				MoreLikeThisQuery query = new MoreLikeThisQuery(kw, moreLikeFields, analyzer);
				// 设置停用词
				// query.setStopWords(getStopWords(reader));
				
				//最少的词频 
				//Sets the frequency below which terms will be ignored in the source doc.
				query.setMinTermFrequency(1);

				//最多的查询词数目
				//Sets the maximum number of query terms that will be included in any generated query.
				query.setMaxQueryTerms(5);
				
				//词至少在这么多篇文档中出现
				//Ignore words which do not occur in at least this many docs.  DEFAULT_MIN_DOC_FREQ = 5
				query.setMinDocFreq(1);

				System.out.println("搜索条件:" + query.toString());   
            	
                long start = System.currentTimeMillis();   
                TopDocs tDocs = search.search(query,10);   
                   
                ScoreDoc sDocs[] = tDocs.scoreDocs;   
  
                int len = sDocs.length;   
                   
                for(int i=0;i<len;i++){   
                    ScoreDoc tScore = sDocs[i];   
                    //从Lucene3.0开始已经不能通过 tScore.score 这样来得到些文档的得分了   
                    int docId = tScore.doc;   
                    Explanation exp = search.explain(query, docId);   
                       
                    Document tDoc = search.doc(docId);   
                    String Name = tDoc.get("Name");   
                    String Info = tDoc.get("Info");   
                    String Time = tDoc.get("Time");   
                       
                    float score = exp.getValue();   
                    //System.out.println(exp.toString()); //如果需要打印文档得分的详细信息则可以通过此方法 
                       
                    System.out.println("DocId:"+docId+"\tScore:" + score + "\tName:" + Name + "\tTime:" + Time + "\tInfo:" + Info);   
                }   
                Long end = System.currentTimeMillis();   
                System.out.println("搜索用时:" + (end -start) + "ms");   
                search.close();   
            }   
               
        }catch(Exception ex){   
            ex.printStackTrace();   
        }   
    }   

}

 

 

运行结果:

搜索条件:like:php 开发工程师
DocId:2 Score:1.1971036 Name:php 开发工程师 Time:20100201 Info:主要是维护公司的网站php开发,能独立完成网站的功能
DocId:5 Score:0.82631415 Name:php 软件工程师 Time:20100130 Info:具有大量的php开发经验,如熟悉 java 开发,数据库管理则更佳
DocId:4 Score:0.6882751 Name:lucene开发工程师 Time:20100131 Info:需要两年或者以上的从事lucene java 开发工作的经验,需要对算法,排序规则等有相关经验,java水平及基础要扎实
DocId:0 Score:0.038315877 Name:java 开发人员 Time:20100201 Info:招聘 网站开发人员,要求一年或以上工作经验
DocId:1 Score:0.027368484 Name:高级开发人员(java 方向) Time:20100131 Info:需要有四年或者以上的工作经验,有大型项目实践,java基本扎实
搜索用时:47ms

 

 

1
0
分享到:
评论

相关推荐

    lucene例子(一个完整的,lucene例子)(lucenetest.rar,lucene,全文检索,lucene例子)

    lucenetest.rar,lucene,全文检索,lucene例子 lucenetest.rar,lucene,全文检索,lucene例子lucenetest.rar,lucene,全文检索,lucene例子

    lucene与quartz例子

    lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子

    lucene3.0 例子

    lucene3.0 例子lucene3.0 例子 lucene3.0 例子 ,很好的学习,只有原代原,jar 包自己加上去就OK了

    lucene文档例子

    lucene文档例子

    lucene3 例子

    【标题】:“Lucene3 实例解析” 在深入探讨Lucene3这个主题之前,我们先来了解一下Lucene是什么。Lucene是一个开源的全文检索库,由Apache软件基金会开发,广泛应用于各种信息检索系统中,包括搜索引擎、内容管理...

    lucene入门小例子

    这个“lucene入门小例子”很可能是为了帮助初学者理解并掌握Lucene的基本用法而设计的一系列示例代码。 Lucene的核心概念包括索引、文档、字段和查询。首先,你需要理解索引的概念,它类似于传统数据库中的索引,但...

    Heritrix+Lucene搜索例子

    这个“Heritrix+Lucene搜索例子”可能涉及到如何将Heritrix抓取的数据整合到Lucene的搜索框架中,从而实现对网络抓取内容的有效检索。 首先,Heritrix的工作流程包括配置爬虫策略、启动爬虫、抓取网页、存储和归档...

    一个基于LUCENE搜索引擎项目例子

    在这个项目例子中,我们将深入探讨如何利用Lucene进行索引构建、查询处理以及结果排序,从而创建一个功能完善的搜索引擎。 首先,我们需要了解Lucene的基本概念。Lucene的核心功能包括文本分析、索引构建和搜索。...

    SQLServer+Lucene.Net例子

    本文将深入探讨如何结合SQL Server数据库与Lucene.NET,实现高效、灵活的全文搜索功能。Lucene.NET是一个强大的、开源的全文检索库,它为.NET开发者提供了构建高效搜索引擎的工具。 首先,让我们了解SQL Server。...

    Lucene学习例子与文档

    **Lucene学习例子与文档详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了完整的搜索功能,包括索引、查询、排序等。Lucene被广泛应用于各种需要全文检索的项目中,如网站、文档管理、...

    lucene检索小例子

    **Lucene检索小例子** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。这个"lucene检索小例子"程序展示了如何利用Lucene的强大功能来构建索引和执行搜索操作。Lucene的核心特性包括文本分析、...

    lucene7例子

    《深入理解Lucene 7:一个实用的例子》 在信息技术领域,搜索引擎的构建与优化是一项至关重要的任务。Apache Lucene,作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将围绕“Lucene 7例子”这一...

    lucene开发部分例子

    这个压缩包文件“lucene开发部分例子”包含了关于Lucene开发的一些实例,涵盖了从基础到进阶的多个方面,对于学习和理解Lucene的使用非常有帮助。 首先,"Web搜索引擎开发实例"这部分内容将教你如何使用Lucene来...

    LUCENE的搜索引擎例子

    在IT行业中,Lucene是一个非常重要的开源全文搜索引擎库,由Apache软件基金会开发并维护。本篇文章将深入探讨如何在B/S(浏览器/服务器)架构下利用Lucene实现一个简单的搜索引擎实例。 首先,我们需要了解Lucene的...

    lucene简单例子

    标题"lucene简单例子"指出我们将探讨如何使用Apache Lucene这个开源全文搜索引擎库进行数据存储和搜索。Lucene是Java开发的一个高性能、可扩展的信息检索库,它提供了强大的文本分析和索引功能,使得开发者能够轻松...

    lucene 简单例子

    **Lucene 简单例子** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会开发。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够在他们的应用程序中轻松地实现全文检索功能。本例子将介绍如何使用 ...

    lucene 3.0 例子

    这里的“lucene 3.0 例子”是针对Lucene 3.0版本的一个示例项目,旨在帮助新手快速理解和掌握Lucene的基本用法。 首先,让我们了解一下Lucene 3.0的核心概念: 1. **索引(Indexing)**:Lucene首先将文档内容转化...

    lucene4.6例子

    《深入理解Lucene 4.6:索引构建、查询执行与近实时搜索》 Lucene是一个开源全文搜索引擎库,广泛应用于各种信息检索系统。在本文中,我们将深入探讨Lucene 4.6版本,包括如何创建索引、执行查询以及实现近实时搜索...

    Lucene简单例子

    以上是对“Lucene简单例子”中涉及的关键知识点的详细解释,这个例子应该包含创建索引、执行搜索以及可能的更新和删除操作的示例代码,帮助新手快速上手Lucene。在实际项目中,还可以结合其他技术,如Solr或Elastic...

Global site tag (gtag.js) - Google Analytics