`

lucene跨度域查询(一)

 
阅读更多

一、跨度域查询

       基类是:SpanQuery

       子类:SpantermQuery;     //测试用的这个子类当然还有其他

 

二、测试

public class SpanTest {

	Directory dir;
	IndexWriter writer;
	IndexReader reader;
    IndexSearcher search;
    String[] ceshi;
    //初始化把索引存在内存中做测试
    public void init() throws IOException{
    	dir=new RAMDirectory();
    	writer=writer(dir);
    	ceshi=new String[]{"i like you","are you ok"};
    	
    }
    
    public IndexWriter writer(Directory dir) throws IOException{
    	Analyzer analyzer=new WhitespaceAnalyzer(Version.LUCENE_42);
    	IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_42,analyzer);
    	return    new IndexWriter(dir, config);
    }
    
    public void createWrite() throws IOException{
    	
    	for(int i=0;i<ceshi.length;i++){
    		
    		Document doc=new Document();
    		doc.add(new TextField("contents",ceshi[i],Store.YES));
    	    writer.addDocument(doc);
    	}
    	writer.close();
    }
    
    public void test() throws IOException{
    	
    	reader=DirectoryReader.open(dir);
    	search=new IndexSearcher(reader);
    	
    	
    	SpanTermQuery query=new SpanTermQuery(new Term("contents","you"));
    	Map<Term,TermContext>m=new HashMap<Term,TermContext>();
		TermContext termContext=TermContext.build(search.getTopReaderContext(),query.getTerm(),false);
		m.put(query.getTerm(), termContext);
		
		Bits bits = new Bits.MatchAllBits(0); 
				
	    Spans spans=query.getSpans(reader.getContext().leaves().get(0),bits, m);
	    int num=0;
	    System.out.println(query.getTerm());
	    while(spans.next()){
	    	num++;
	    	int id=spans.doc();
	    	
	    	Document d=reader.document(id);
	   Analyzer analyzer=new WhitespaceAnalyzer(Version.LUCENE_42);
	   TokenStream ts= analyzer.tokenStream("contents", new StringReader(d.get("contents")));
	  CharTermAttribute termAttribute = ts.addAttribute(CharTermAttribute.class);
	  ts.reset();  //此行,不能少,不然会报 java.lang.ArrayIndexOutOfBoundsException
  	 
      StringBuffer buffer=new StringBuffer("");
      
      buffer.append("");
  	int k=0;
  	 while(ts.incrementToken()){
       	    
       		if(k==spans.start()){			
       		buffer.append("<");
       		}
       		buffer.append(termAttribute.toString());
       		if(k+1==spans.end()){
       			
       			buffer.append(">");
       		}
   
       		buffer.append("  ");
       		k++;
       	}
  	 System.out.println(spans.start()+"        "+spans.end());
	    	System.out.println(buffer);
	   
	    	//if(num==3)break;
	    	//break;
	    }
	    if(num==0){
	    	
	    	System.out.println("no spans");
	    }
    }
    
   public static void main(String[] args) throws IOException {
	SpanTest s=new SpanTest();
	s.init();
	s.createWrite();
	s.test();
}
}

 运行结果:

 最后:

int k=0;
  	 while(ts.incrementToken()){
       	    
       		if(k==spans.start()){			
       		buffer.append("<");
       		}
       		buffer.append(termAttribute.toString());
       		if(k+1==spans.end()){
       			
       			buffer.append(">");
       		}
   
       		buffer.append("  ");
       		k++;
       	}
但是当用其他的分词器里面的匹配写法就出错了,因为其他分词器可能了一些会分词的时候会根据
需求去掉一些词,例如StopWords或者其他的一些词,而那个匹配是根据从0开始的,所以当用
其他的分词器这个地方不是一个真正的单词位置。

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 8.4 KB
分享到:
评论

相关推荐

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

    在IT领域,Lucene是一个非常重要的全文搜索引擎库,它由Apache软件基金会开发并维护。Lucene提供了高效的文本分析、索引和搜索功能,是许多大型网站和应用的基础。本话题聚焦于“Lucene多字段查询”和“文字高亮显示...

    Lucene3.0之查询类型详解

    在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较低。 - **索引查询**:基于预...

    lucene表达式处理查询

    在Lucene中,表达式查询是一种高级查询方式,允许用户通过特定的语法构造复杂的查询条件。本篇文章将深入探讨Lucene表达式处理查询的原理、语法及示例。 ### 1. Lucene表达式查询基础 Lucene表达式查询是基于...

    Lucene索引和查询

    **Lucene索引和查询** Lucene是Apache软件基金会的开放源码全文...本项目提供了一个基础的实现示例,对于初学者来说,是学习Lucene索引和查询的绝佳起点。在实际应用中,可以进一步扩展和优化,以满足更复杂的需求。

    lucene做索引查询流程

    lucene 做索引查询流程,来自《lucene in action》

    lucene的查询语法事例

    **Lucene查询语法详解** Apache Lucene是一款高性能、全文本搜索库,被广泛应用于各种搜索引擎的构建。在使用Lucene进行信息检索时,理解和掌握其查询语法至关重要。本篇文章将深入探讨Lucene的查询语法,帮助你更...

    Lucene分词与查询详解

    5. **评分(Scoring)**:Lucene会根据查询和文档的相关性给出一个分数,决定搜索结果的排序。TF-IDF(Term Frequency-Inverse Document Frequency)是最常用的评分算法。 现在,我们详细讲解如何在Lucene中进行...

    Lucene时间区间搜索

    在上面的代码中,`DateTools.DateToString`方法将DateTime对象转换为Lucene可理解的字符串格式,然后创建了一个包含这两个时间点的闭合范围查询。这里的“true”参数表示边界是包含的。 接下来,我们需要将这个...

    C#调用Lucene方法-实现快速搜索

    Lucene是一个高性能、全文本搜索库,它被广泛应用于各种系统中以提供高效、精确的搜索功能。本篇文章将详细探讨如何在C#环境下利用Lucene实现快速搜索。 首先,让我们了解Lucene的基本概念。Lucene是一个开源的Java...

    Lucene建索引及查询关键字

    在Eclipse环境中运用java,Lucene建索引及查询关键字

    lucene 公交路线查询系统

    在这个“lucene 公交路线查询系统”项目中,开发人员利用Lucene的技术为某市创建了一个公交路线查询平台,使得用户能够快速、方便地找到最优的公交出行方案。 首先,Lucene的核心功能是文本索引和搜索。在本项目中...

    lucene查询结果集分页代码

    而我们可以将这两种方式结合下,每次查询都多缓存一部分的结果集,翻页的时候看看所查询的内容是不是在已经存在在缓存当中,如果已经存在了就直接拿出来,如果不存在,就进行查询后,从缓存中读出来. 比如:现在我们有一个...

    lucene facet查询示例

    **Lucene Facet查询详解** Lucene是一款强大的全文搜索引擎库,广泛应用于各种信息检索系统。在处理大量数据时,为了帮助用户快速、有效地探索和理解数据,Lucene引入了Facets(方面)功能,它提供了分类浏览和统计...

    Lucene5学习之分页查询

    本文将深入探讨"Lucene5学习之分页查询"这一主题,结合给定的标签"源码"和"工具",我们将讨论如何在Lucene5中实现高效的分页查询,并探讨其背后的源码实现。 首先,理解分页查询的重要性是必要的。在大型数据集的...

    lucene实现企业产品检索

    Lucene是一款强大的全文搜索引擎库,由Apache软件基金会开发,它为企业构建高效、可扩展的搜索功能提供了强大的支持。在本文中,我们将深入探讨如何使用Lucene来实现一个类似当当网的企业产品检索系统,特别关注如何...

    lucene高级智能查询小案例

    本篇将通过一个小案例,探讨Lucene在高级智能查询中的应用,尽管案例中可能存在一些小瑕疵,但主要的功能与思路已得以体现。 Lucene的核心在于其建立倒排索引的能力,这种索引结构使得快速匹配大量文档成为可能。...

    lucene与数据库连接进行查询

    Lucene 是一个高性能、全文本搜索库,常用于构建搜索引擎应用。它提供了高效的索引和查询功能,使得在大量文本数据中快速查找相关信息变得可能。而数据库,如 MySQL、PostgreSQL 或 Oracle,通常用于存储结构化的...

    lucene相关jar+查询分析器jar

    2. **查询分析器(Query Analyzer)**:这是Lucene中的一个核心组件,负责将用户的查询字符串转化为一系列的分词(Token),以便与索引中的分词进行匹配。默认的分析器会处理如停用词、词形还原等文本预处理工作。在...

    lucene,lucene教程,lucene讲解

    Directory类代表一个Lucene索引的位置。它是一个抽象类. 其中的两个实现: 第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。 第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 ...

Global site tag (gtag.js) - Google Analytics