`
gcgmh
  • 浏览: 355831 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene TermVector用法:相关搜索功能及提高高亮显示性能

阅读更多
public class TermVectorTest {
	
	Analyzer analyzer = new SimpleAnalyzer();
	Directory ramDir = new RAMDirectory();
	
	public void createRamIndex() throws CorruptIndexException, LockObtainFailedException, IOException{
		
		IndexWriter writer = new IndexWriter(ramDir,analyzer,IndexWriter.MaxFieldLength.LIMITED);
		
		Document doc1 = new Document();
		doc1.add(new Field("title","java",Store.YES,Index.ANALYZED));
		doc1.add(new Field("author","callan",Store.YES,Index.ANALYZED));
		doc1.add(new Field("subject","java一门编程语言,用java的人很多,编程语言也不少,但是java最流行",Store.YES,Index.ANALYZED,TermVector.WITH_POSITIONS_OFFSETS));
		
		Document doc2 = new Document();
		doc2.add(new Field("title","english",Store.YES,Index.ANALYZED));
		doc2.add(new Field("author","wcq",Store.YES,Index.ANALYZED));
		doc2.add(new Field("subject","英语用的人很多",Store.YES,Index.ANALYZED,TermVector.WITH_POSITIONS_OFFSETS));
	
		Document doc3 = new Document();
		doc3.add(new Field("title","asp",Store.YES,Index.ANALYZED));
		doc3.add(new Field("author","ca",Store.YES,Index.ANALYZED));
		doc3.add(new Field("subject","英语用的人很多",Store.YES,Index.ANALYZED,TermVector.WITH_POSITIONS_OFFSETS));
		
		writer.addDocument(doc1);
		writer.addDocument(doc2);
		writer.addDocument(doc3);
		
		writer.optimize();
		writer.close();
	}
	
	public void search() throws CorruptIndexException, IOException{
		IndexReader reader = IndexReader.open(ramDir);
		IndexSearcher searcher = new IndexSearcher(reader);
		Term term = new Term("title","java");	//在title里查询java词条
		TermQuery query = new TermQuery(term);
		Hits hits = searcher.search(query);
		for (int i = 0; i < hits.length(); i++)
		{
			Document doc = hits.doc(i);
			System.out.println(doc.get("title"));
			System.out.println(doc.get("subject"));
			System.out.println("moreLike search: ");
			
			morelikeSearch(reader,hits.id(i));
		}
	}

	private void morelikeSearch(IndexReader reader,int id) throws IOException
	{
		//根据这个document的id获取这个field的Term Vector 信息,就是这个field分词之后在这个field里的频率、位置、等信息
		TermFreqVector vector = reader.getTermFreqVector(id, "subject");
		
		BooleanQuery query = new BooleanQuery();  
		
		for (int i = 0; i < vector.size(); i++)
		{
			 TermQuery tq = new TermQuery(new Term("subject",   
		                vector.getTerms()[i]));   //获取每个term保存的Token
		           
		         query.add(tq, BooleanClause.Occur.SHOULD);   

		}
		
		IndexSearcher searcher = new IndexSearcher(ramDir);   
	       
	    Hits hits = searcher.search(query);   
	    
	    //显示代码,略

		
	}

//Lucene使用TermVector提高高亮显示性能
	public void highterLightSearch() throws CorruptIndexException, IOException{
		IndexReader reader = IndexReader.open(ramDir);   
        
        IndexSearcher searcher = new IndexSearcher(reader);   
           
        TermQuery query = new TermQuery(new Term("subject","java"));   
           
        Hits hits = searcher.search(query);   
           
        //高亮显示设置   
        SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
           
        Highlighter highlighter =new Highlighter(simpleHTMLFormatter,new QueryScorer(query));   
        
         // 这个100是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容   
        highlighter.setTextFragmenter(new SimpleFragmenter(100));   
  
        for(int i = 0; i < hits.length(); i++){   
               
            Document doc = hits.doc(i);   
               
            TermPositionVector termFreqVector = (TermPositionVector)reader.getTermFreqVector(hits.id(i), "subject");   
             
            TermFreqVector vector = reader.getTermFreqVector(hits.id(i), "subject");
            TokenStream tokenStream = TokenSources.getTokenStream(termFreqVector);   
               
            String result = highlighter.getBestFragment(tokenStream, doc.get("subject"));   
  
            System.out.println(doc.get("title"));   
               
            System.out.println(result);   
               
        }   

		
	}
	
	public static void main(String[] args) throws CorruptIndexException, IOException
	{
		TermVectorTest  t = new TermVectorTest();
		t.createRamIndex();
		t.search();
	}

}
分享到:
评论

相关推荐

    lucene 高亮显示. java

    对于深入理解和掌握Lucene的高亮显示功能及中文分词性能优化,建议参考官方文档和相关技术博客,同时进行实际的编码实践,以便更好地理解和运用这一知识点。此外,关注Lucene社区的最新动态,可以获取更多关于性能...

    SpringBoot+Lucene搜索结果高亮显示Demo

    **SpringBoot+Lucene搜索结果高亮显示** 在现代Web应用程序中,强大的全文搜索引擎功能是不可或缺的,而Apache Lucene正是这样一个高效的、可扩展的开源全文检索库。在这个SpringBoot+Lucene的Demo中,我们将深入...

    Lucene5学习之TermVector项向量

    在深入理解Lucene5的搜索引擎功能时,TermVector(项向量)是一个关键的概念,它对于文本分析、信息检索和相关性计算等方面起着至关重要的作用。TermVector是Lucene提供的一种特性,允许我们存储和检索文档中每个...

    lucene高亮显示

    ### Lucene高亮显示详解 在全文搜索领域,Apache Lucene是业界标准的搜索引擎库,提供了强大的文本搜索功能。而在搜索结果中实现关键词高亮显示,可以极大地提升用户体验,让用户快速定位到搜索词所在的位置。本文...

    Lucene+HighLighter高亮显示实例

    本篇文章将深入探讨如何利用Apache Lucene这个强大的全文搜索引擎库,结合Highlighter组件实现搜索结果的高亮显示。 Apache Lucene是一个高性能、可扩展的开源全文检索库,它提供了完整的索引和搜索功能,使得...

    lucene 多字段查询+文字高亮显示

    总的来说,Lucene的多字段查询和文字高亮显示是提高用户体验和增强搜索功能的关键技术。它们使得用户能够更快地找到相关信息,并且更直观地看到搜索结果中的关键匹配点。通过深入学习和实践,你可以在自己的项目中...

    lucene.net以及高亮的DLL文件

    标题中的“lucene.net以及高亮的DLL文件”指的是在.NET环境中使用Lucene搜索引擎库时,涉及到了文本高亮显示的DLL组件。Lucene.Net是一个开源的全文检索库,它是Apache Lucene项目针对.NET Framework的移植版本,为...

    android+lucene实现全文检索并高亮关键字索引库

    下面我们将深入探讨如何在Android环境中利用Lucene来创建一个高效、功能丰富的全文检索系统,并了解如何高亮显示搜索结果中的关键字。 首先,我们要理解全文检索的基本原理。全文检索是指通过建立倒排索引来快速...

    使用Lucene4.7实现搜索功能,分页+高亮

    标题中的“使用Lucene4.7实现搜索功能,分页+高亮”表明我们要讨论的是如何利用Apache Lucene 4.7版本来构建一个具备搜索、分页和高亮显示功能的系统。Lucene是一个高性能、全文本搜索引擎库,它提供了强大的文本...

    lucene.NET 中文分词

    - **缓存策略**:合理使用Lucene.NET的缓存机制,如TermVector缓存,可以提升查询性能。 总的来说,Lucene.NET在中文分词和高亮显示方面的应用需要结合合适的分词器,并进行适当的配置和优化。开发者可以根据实际...

    自己写的lucene分页高亮显示代码

    本压缩包中的代码着重展示了如何使用 Lucene 进行分页搜索和结果高亮显示。下面将详细解释这两个关键知识点。 **一、Lucene 分页搜索** 在大型数据集上进行搜索时,一次性返回所有结果并不实际,因此分页搜索显得...

    lucence高亮显示

    Apache Lucene是一个强大的全文搜索引擎库,它提供了多种功能,包括高亮显示搜索结果。高亮显示有助于提高用户体验,使用户能够一目了然地看到哪些词在文档中匹配了查询。 **1. Lucene高亮器概述** Lucene提供了一...

    一步一步跟我学习lucene(11)---lucene搜索之高亮显示highlighter

    在本教程中,我们将深入探讨Lucene中的高亮显示机制,这是搜索引擎返回结果时非常有用的一项功能,可以突出显示与查询匹配的关键字。在实际应用中,用户通常希望看到搜索词在文档中的确切位置,高亮显示使得这些匹配...

    java实现高亮显示的jar包,lucene用的jar包

    这个标题提到的"java实现高亮显示的jar包,lucene用的jar包"是指利用Lucene库进行文本搜索时,对搜索结果进行高亮显示的相关功能。下面我们将深入探讨Lucene的核心组件、高亮显示的实现原理以及相关jar包的作用。 ...

    java实现lucene高亮显示Html,直接测试就可以用

    高亮显示是搜索结果中的一种常见处理方式,它通过使用特定的样式(如背景色或粗体)来突出显示与搜索查询匹配的关键词,使用户能够一眼看出哪些部分与他们的搜索请求相关。 在Java和Lucene中,实现这个功能通常涉及...

    lucene-core-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...

    lucene3.6 搜索例子

    作为一个高性能的信息检索库,Lucene主要包含以下组件:索引、搜索、分析和高亮显示。在3.6版本中,它保持了对大量文档高效处理的能力,并且对查询性能进行了优化。 二、索引构建 1. 文档创建:在Lucene中,所有的...

    Lucene与SSH2搜索功能

    在搜索功能的实现中,Spring可以帮助管理Lucene的相关组件,如索引目录、搜索引擎实例等,同时通过其强大的数据访问支持与Hibernate协同工作。 **Hibernate** 是一个对象关系映射(ORM)框架,使得Java开发者可以更...

    Lucene与数据库结合示例(加双关键字高亮)

    "加了高亮,看起来就更好点"意味着这个示例不仅实现了基本的搜索功能,还加入了高亮显示搜索关键词的特性,使得用户能更直观地看到搜索结果中与查询相关的部分。 **标签:“Lucene”** Lucene是Apache软件基金会的...

    Lucene 搜索方法(多短语搜索)

    Lucene是一个高性能、全文本搜索库,它提供了一个强大的文本检索框架,使得开发者能够为他们的应用程序添加高级搜索功能。多短语搜索是指在查询中包含两个或更多相邻词的短语,它比单个词的搜索更为精确,有助于用户...

Global site tag (gtag.js) - Google Analytics