`
Callan
  • 浏览: 735850 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Lucene使用项向量进行模糊查询

阅读更多

TermVector是Lucene 1.4新增的 它提供一种向量机制来进行模糊查询,TermVector保存Token.getPositionIncrement() 和Token.startOffset() 以及Token.endOffset() 信息.

 

Field.TermVector.NO:不保存term vectors
Field.TermVector.YES:保存term vectors
Field.TermVector.WITH_POSITIONS:保存term vectors.(保存值和token位置信息)
Field.TermVector.WITH_OFFSETS:保存term vectors.(保存值和Token的offset)
Field.TermVector.WITH_POSITIONS_OFFSETS:保存term vectors.(保存值和token位置信息和Token的offset)

 

下面是个简单的例子:

                Analyzer analyzer = new StandardAnalyzer();
	
	RAMDirectory directory = new RAMDirectory();
	
	/** 
	 * 创建索引
	 * 
	 * @throws IOException
	 */
	public void index() throws IOException{
		
		IndexWriter indexWriter = new IndexWriter(directory,analyzer,true);
		
		Document doc1 = new Document();
		
		doc1.add(new Field("title","java",Store.YES,Index.TOKENIZED));
		
		doc1.add(new Field("author","callan",Store.YES,Index.TOKENIZED));
		
		doc1.add(new Field("subject", "java一门编程语言",
				Store.YES, Index.TOKENIZED,TermVector.WITH_POSITIONS_OFFSETS));
		
		indexWriter.addDocument(doc1);
		
		Document doc2 = new Document();
		
		doc2.add(new Field("title","english",Store.YES,Index.TOKENIZED));
		
		doc2.add(new Field("author","wcq",Store.YES,Index.TOKENIZED));
		
		doc2.add(new Field("subject", "英语用的人很多",
				Store.YES, Index.TOKENIZED,TermVector.WITH_POSITIONS_OFFSETS));
		
		indexWriter.addDocument(doc2);
		
		Document doc3 = new Document();
				
		doc3.add(new Field("title","asp",Store.YES,Index.TOKENIZED));
				
		doc3.add(new Field("author","ca",Store.YES,Index.TOKENIZED));
				
		doc3.add(new Field("subject", "asp很多人用",
				Store.YES, Index.TOKENIZED,TermVector.WITH_POSITIONS_OFFSETS));
		
		indexWriter.addDocument(doc3);
		
		indexWriter.optimize();
		
		indexWriter.close();
	}
	
	// 进行搜索
	public void searcher() throws IOException{
		
		IndexSearcher searcher = new IndexSearcher(directory);
		
		// 搜索书名为java的索引
		TermQuery query = new TermQuery(new Term("title","java"));
		
		Hits hits = searcher.search(query);
		
		// 能找到一条记录
		for(int i = 0; i < hits.length(); i++){
			
			Document doc = hits.doc(i);
			
			System.out.println("书名:" + doc.get("title") + "  " + "作者:" + doc.get("author") + "简介:" + doc.get("subject"));
			
			System.out.println("相关的书:");
			
			docsLike(hits.id(i));
			
		}
		
	}
	
	// 在subject中模糊搜索与doc相进的索引
	public void docsLike(int id) throws IOException {
		
		IndexReader reader = IndexReader.open(directory);
		
		TermFreqVector  vector = reader.getTermFreqVector(id, "subject");
	
		BooleanQuery query = new BooleanQuery();
		
		for (int j = 0; j < vector.size(); j++) {
			
			TermQuery tq = new TermQuery(new Term("subject",
					vector.getTerms()[j]));
			
			 query.add(tq, BooleanClause.Occur.SHOULD);
		}
		
		IndexSearcher searcher = new IndexSearcher(directory);
		
		Hits hits = searcher.search(query);
		
		printResult(hits);
		
	}
	
	// 显示结果
	public void printResult(Hits hits) throws IOException{
		
		for(int i = 0; i < hits.length(); i++){
			
			Document d = hits.doc(i);
			
			System.out.println("书名:" + d.get("title")+"  " + "作者:" + d.get("author") +"  " + "简介:" + d.get("subject"));
			
		}
	}
	

	public static void main(String[] args) throws IOException {
		
		TermFreqVectorTest3 test = new TermFreqVectorTest3();
		
		test.index();
		
		test.searcher();
	}


搜索结果:

书名:java  作者:callan简介:java一门编程语言
相关的书:
书名:java  作者:callan  简介:java一门编程语言
书名:english  作者:wcq  简介:英语用的人很多

搜索书名为java 的索引,并且搜索与java的简介相关的索引.
将书<<java>>的subject分词为java/一/门/编/程/语/言/

在subject中搜索包含java/一/门/编/程/语/言/的索引

<<english>>包含语


 

6
1
分享到:
评论
1 楼 lc204 2011-03-17  
我用的lucene3.0,new Field这个方法不能用,一直报错。想知道怎么改一下,多谢您!

相关推荐

    lucene-4.7.0全套jar包

    2. **搜索算法**:Lucene实现了布尔、短语、模糊、评分等高级搜索算法,使得用户可以灵活地构造复杂的查询条件。 3. **高性能**:Lucene通过内存缓存、位向量和优化的数据结构来提高搜索速度。同时,它支持多线程...

    Lucene的简单介绍

    5. 默认实现了一套强大的查询引擎:Lucene的查询引擎默认实现了布尔操作、模糊查询(FuzzySearch)、分组查询等多种功能,用户无需编写代码即可获得强大的查询能力。 Lucene在搜索过程中,首先需要建立索引。索引...

    lucene.net1.4.3全文检索源文件

    1. 高性能:Lucene.NET使用内存映射文件(MMap)提高索引读取速度,并采用位向量技术进行快速匹配。 2. 支持多种查询类型:包括短语查询、布尔查询、范围查询、模糊查询等。 3. 多线程支持:允许多个线程同时读取...

    lucene搜索引擎简介

    例如,Lucene 1.4引入了排序、跨度查询和词项向量等新特性,而后续的版本则修复了一些性能问题并进行了优化。 Lucene的特点和优势显著,首先,它的索引文件格式是跨平台的,这意味着不同操作系统或应用可以共享同一...

    Lucene_原理与代码分析完整版

    5. **高级特性层** - 提供高级搜索功能,如模糊查询、近义词查询等。 #### 三、Lucene的索引文件格式 Lucene索引文件的格式是其高效性和可扩展性的关键所在,主要包括以下几种类型的文件: - **段元数据文件**...

    Lucene3.5的学习研究报告

    例如,Lucene的查询处理不分大小写,对包含英文、数字或特殊字符的关键字进行分词,从而实现模糊查询。然而,如果需要精确查询,就需要调整分词策略。对于高亮显示结果时丢失标点的问题,可以通过选择合适的分析器,...

    Lucene 3.0 原理与代码分析完整版

    用户可以使用布尔查询、范围查询、模糊查询等复杂的查询表达式。Lucene通过JavaCC工具和QueryParser类来解析用户输入的查询语句,并将其转换为Lucene内部可以处理的查询对象。 分词器(Analyzer)是Lucene处理文本...

    lucene.net2.9.4编译版

    它实现了许多高级搜索技术,如布尔查询、短语查询、模糊查询以及复杂的评分机制,使得开发者可以快速构建功能强大的搜索应用。 2. DLL文件的作用 在Lucene.NET 2.9.4编译版中,最重要的文件就是包含的DLL(动态链接...

    Lucene.Net-2.9.2.rar

    例如,可以使用ASP.NET MVC或Web API创建一个前端界面,用户通过该界面输入查询,后端则调用Lucene.Net进行搜索并返回结果。 总的来说,“Lucene.Net-2.9.2”版本提供了稳定、高效的全文检索功能,对于需要在.NET...

    WebLucene2.zip

    3. **搜索与排序**:用户输入查询后,Lucene会比较查询词与索引中的词,找出匹配的文档,并根据相关性进行排序。相关性通常是基于查询词在文档中出现的频率和位置计算的。 4. **过滤和高亮**:Lucene还支持对搜索...

    解密搜索引擎lucene & java

    Lucene还提供了丰富的查询语法,如布尔查询、短语查询和范围查询,以及模糊匹配、近似搜索等功能。在Java中,开发者可以通过Lucene的API创建索引,执行查询,优化性能,并处理复杂的检索需求。 除了基础功能,...

    搜索引擎Lucene+Heritrix(第二版)4

    Lucene支持多种查询语法,如布尔查询、短语查询、模糊查询等。 4. **性能优化**:Lucene提供了多线程索引、块级检索等特性,以提升性能。同时,通过位向量和缓存等技术,能进一步提高搜索效率。 5. **扩展性**:...

    Lucene3.6.2搜索

    4. **内存优化**:Lucene通过使用位向量和压缩技术来减少内存占用,提高检索速度。 5. **文档更新**:支持对已索引文档的更新和删除,保持索引的实时性。 6. **分片和分布式搜索**:在大型系统中,可以通过分片...

    Mastering ElasticSearch 5.0

    - **全文本搜索查询案例**:使用全文本搜索查询来进行自然语言搜索,如模糊匹配。 通过以上介绍,我们可以看到ElasticSearch 5.x不仅在技术上有了显著提升,而且在实际应用场景中也更加灵活和强大。对于那些希望...

    关键字所用的jar包

    4. **搜索算法**: Lucene支持多种搜索算法,如布尔搜索、短语搜索、模糊搜索等,可以根据需求灵活配置。通过这些算法,用户可以构造复杂的查询条件来获取相关结果。 5. **优化与性能**: 为了提高搜索效率,开发者还...

    Lucence创建索引

    - **TermVector**:Lucene 1.4.3 版本新增的功能,提供一种向量机制进行模糊查询。 #### 三、Field 构造函数解析 - **构造函数示例**: ```java Field(String name, byte[] value, Field.Store store) Field...

    Mastering ElasticSearch 2nd Edition

    了解Elasticsearch的高级查询特性是构建高效搜索应用的关键,包括掌握如何使用Query DSL来精确控制搜索过程,如何使用查询模板来简化复杂查询的编写,以及如何处理过滤器以优化查询性能等。作者在书中强调了过滤器在...

    基于Lire库搜索相似图片源码

    这通常涉及将Lire生成的图像特征存储到Lucene的文档中,然后使用Lucene的查询API来检索匹配的特征和元数据。 总结来说,Lire库提供了一种有效的方法来处理图像搜索任务,结合Lucene可以进一步提升搜索体验。通过...

Global site tag (gtag.js) - Google Analytics