`

lucene第一步---2.查询

阅读更多
package demo.first;

import java.io.*;
import java.util.Date;

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.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.WildcardQuery;

public class Search {

	Date startTime,endTime;
	
	/**
	 * 索引文件的存放位置
	 */
	String path = "D://workspace//fwk//lucenedemo//firstLuceneIndex";
	
	/**
	 * 创建索引
	 */
	public void createLuceneIndex(){
		IndexWriter writer;
		try {
			writer = new IndexWriter(path,new StandardAnalyzer(),true);
			Document docA = new Document();
			//相当于数据库中列的概念,因此第一个参数是列名,第二个参数是列的值,最后两个参数是enum类型的(JDK1.5),对创建的索引的设置
			//Field.Store 是否覆盖原来的索引文件,而不是重新建一个
			Field fieldA = new Field("content","搜索引擎",Field.Store.YES,Field.Index.TOKENIZED);
			//我们把列(fieldA)加到某一行(docA)中
			docA.add(fieldA);
			//英文 测试
			docA.add(new Field("content","hello llying ,I love you",Field.Store.YES,Field.Index.TOKENIZED));
			docA.add(new Field("lastModifyTime","2010个人",Field.Store.YES,Field.Index.TOKENIZED));
			
			Document docB = new Document();
			//相当于数据库中列的概念,因此第一个参数是列名,第二个参数是列的值,最后两个参数是enum类型的(JDK1.5),对创建的索引的设置
			Field fieldB = new Field("content","创建索引",Field.Store.YES,Field.Index.TOKENIZED);
			//我们把列(fieldA)加到某一行(docA)中
			docB.add(fieldB);
			docB.add(new Field("content","i live in shanghai.i come from cn",Field.Store.YES,Field.Index.TOKENIZED));
			docB.add(new Field("lastModifyTime","2020个人",Field.Store.YES,Field.Index.TOKENIZED));
			
			writer.addDocument(docA);
			writer.addDocument(docB);
			
			//如果对海量数据进行创建索引的时候,需要对索引进行优化,以便提高速度
			writer.optimize();
			
			//跟数据库类似,打开一个连接,使用完后,要关闭它
			writer.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	/**
	 * 创建文件索引
	 */
	public void createIndexByFile(){
		IndexWriter writer;
		try {
			
			String filePath = "D://workspace//fwk//lucenedemo//firstLuceneIndex//test.txt";
			String content = file2String(filePath, "GBK");
			
			//System.out.println(content);
			
			writer = new IndexWriter(path,new StandardAnalyzer(),true);
			
			Document docA = new Document();
			
			Field fieldA = new Field("content",content,Field.Store.YES,Field.Index.TOKENIZED);
			docA.add(new Field("path",filePath,Field.Store.YES,Field.Index.UN_TOKENIZED));
			docA.add(fieldA);
			
			writer.addDocument(docA);
			
			//如果对海量数据进行创建索引的时候,需要对索引进行优化,以便提高速度
			writer.optimize();
			
			//跟数据库类似,打开一个连接,使用完后,要关闭它
			writer.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	private String file2String(String fileName,String charset) throws Exception{
		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName),charset));
		//StringBuilder ,StringBuffer
		StringBuilder builder = new StringBuilder();
		String line = null;
		while((line = reader.readLine())!=null){
			builder.append(line);
		}
		return builder.toString();
	}
	
	/**
	 * 相当于sql中where 后面的条件,WildcardQuery不推荐大家使用
	 * 通配符搜索
	 */
	private Query wildcardQuery(){
		// where username = '张xiangqiang' and password='ILoveChina'
		//?代表至少有一个字符在前面
		//搜索"*搜*",找到一条数据;搜索"*索*",找到两条数据;搜索"*搜索*",找到0条数据;搜索"*索引*",找到0条数据;
		//为什么是这样的结果呢?流行伏笔
		Term term = new Term("content","*c*");
		return new WildcardQuery(term);
	}
	
	//基于lucene的分词 -- TermQuery只能对当个中文进行搜索。英文只能对当个单词进行搜索
	public Query termQuery(){
		Term term = new Term("content","19:58:25");
		return new TermQuery(term);
	}
	/**
	 * 智能搜索
	 * 
	 * @return
	 */
	public Query queryParser(){
		QueryParser queryParser = new QueryParser("content", new StandardAnalyzer());
		try {
			return queryParser.parse("搜索 - 擎");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * '与或'--搜索
	 * @return
	 */
	public Query booleanQuery(){
		Term term1 = new Term("content","索");
		Term term2 = new Term("content","搜");
		
		TermQuery tempQuery1 =  new TermQuery(term1);
		TermQuery tempQuery2 =  new TermQuery(term2);
		
		//本人觉得他更应该叫做JoinQuery 
		BooleanQuery booleanQuery = new BooleanQuery();
		booleanQuery.add(tempQuery1,BooleanClause.Occur.MUST);
		booleanQuery.add(tempQuery2,BooleanClause.Occur.SHOULD);
		return booleanQuery;
	}
	/**
	 * 多关键词搜索
	 * @return
	 */
	public Query phraseQuery(){
		PhraseQuery phraseQuery = new PhraseQuery();
		phraseQuery.setSlop(1);
		phraseQuery.add(new Term("content","搜"));
		phraseQuery.add(new Term("content","擎"));
		return phraseQuery;
	}
	/**
	 * 范围搜索
	 * @return
	 */
	public Query rangeQuery(){
		RangeQuery rangeQuery = new RangeQuery(new Term("lastModifyTime","20000808"),new Term("lastModifyTime","20150808"), true);
		return rangeQuery;
	}
	
	public void search(){
		try {
			//相当于sql中的 select * from talbeName 
			IndexSearcher search = new IndexSearcher(path);
			
			startTime = new Date();
			//抽象的查询对象
			Query query = queryParser();
			//Query query = phraseQuery();
			//搜索结果集Hits,和JDBC的查询结果集完全类似的概念 -- 为什么是这样的呢?
			//lucene在设计的时候,就参照了JDBC的很多概念
			Hits hits = search.search(query);
			for (int i = 0; i < hits.length(); i++) {
				System.out.println(hits.id(i));
				System.out.println(hits.doc(i));
				System.out.println(hits.score(i));
			}
			endTime = new Date();
			
			System.out.println("本次搜索用时:" + (endTime.getTime() - startTime.getTime()) + "毫秒");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	

	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Search search = new Search();
		//search.createLuceneIndex();
		search.createIndexByFile();
		
		search.search();

	}

}
分享到:
评论
1 楼 BarryWei 2008-09-10  
感谢楼主
我看到以前的一个教程
不过那是老版本的

这篇文章的是新版本的lucene 谢谢你了

相关推荐

    lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用

    标题中的“lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用”指出,这个主题将探讨如何在Lucene中应用IKAnalyzer进行中文分词,以及如何使用高亮器(highlighter)来突出搜索结果中的关键词。Lucene是...

    lucene第一步---6.分页

    本篇文章将带你迈出使用Lucene的第一步,重点关注如何实现分页检索,这对于构建高效、用户友好的搜索系统至关重要。 Lucene的核心功能包括文档索引、查询解析和结果排序。在分页检索方面,我们需要考虑如何有效地...

    je-analysis-1.5.1.jar+lucene-core-3.5.0.jar+IKAnalyzer2012.zip

    在自然语言处理领域,文本分词是至关重要的第一步,它涉及到对一段文本进行细粒度的分析,将连续的字符序列分割成具有独立语义的词汇单元,为后续的语义理解、情感分析、信息检索等任务提供基础。在您提供的资源中,...

    最新全文检索 lucene-5.2.1 入门经典实例

    - **Analyzer**:文本分析器是Lucene处理文本的第一步,它负责将输入的字符串分解为一系列的词项(tokens)。在5.2.1版本中,包括了`StandardAnalyzer`和`SimpleAnalyzer`等,适用于不同语言和应用场景。 2. **...

    lucene-analysis.jar

    文本分析是Lucene处理文本数据的第一步,它涉及到文本的分词、去除停用词、词形还原等一系列操作,目的是将复杂的自然语言转化为搜索引擎可以理解和处理的形式。 在"lucene-analysis.jar"中,我们可以找到多种预定...

    lucene基本包

    这个“lucene基本包”是探索和学习Lucene的第一步,其中可能包含了Lucene的JAR文件和其他必要的资源,供开发者在实际项目中导入和使用。通过深入理解并实践这些核心概念和功能,开发者可以充分利用Lucene的强大能力...

    第一个lucene程序

    1. **创建索引**:这是Lucene工作的第一步,它会把文档内容解析成一系列的术语(tokens),然后为每个术语建立倒排索引。倒排索引是一种数据结构,它允许快速查找包含特定术语的文档。 2. **索引写入**:在创建索引...

    clucene-contrib-0.9.13.zip_C lucene_lucene

    7. **API接口设计**:理解C Lucene提供的API接口,如何调用它们进行索引构建和搜索操作,是使用C Lucene的第一步。 总的来说,C Lucene为开发者提供了一个在C语言环境中实现高效全文搜索的途径,虽然它可能带来额外...

    自己写的一个基于词库的lucene分词程序--ThesaurusAnalyzer

    分词是自然语言处理的第一步,它将连续的文本流分解成单独的词语,以便进一步分析和处理。在中文中,由于没有明显的空格分隔,分词显得尤为复杂。传统的Lucene使用标准分词器(StandardAnalyzer),它主要依据词频...

    lucene-3.6.1-src

    1. **索引(Indexing)**:这是Lucene的第一步,它将文档内容转换成可供搜索的索引。核心类`IndexWriter`负责创建和更新索引,它可以处理大量的文档,并通过`Analyzer`进行文本分词。`Analyzer`是Lucene中的关键角色...

    最新版windows lucene-8.7.0.zip

    构建索引是Lucene的第一步,涉及到对文本的预处理,如分词、去除停用词等。在Windows环境中,开发者可以使用Lucene提供的Analyzer类对输入的文本进行分析,然后使用IndexWriter创建索引。 5. **查询与搜索** ...

    lucene3.0

    3. 分词器(Tokenizer):将输入的文本分割成一系列的词汇单元,这是建立索引的第一步。 4. 分词过滤器(TokenFilter):进一步处理分词器生成的词汇,例如去除停用词、词形还原等。 5. 索引(Index): Lucene将...

    Lucene实战中文版第2版.pdf

    索引构建是Lucene的第一步,它将文本数据转换为可快速检索的结构。通过分词器(Tokenizer)和过滤器(Filter),Lucene能够处理中文文本,将句子拆分成关键词,并进行标准化处理,如去除停用词、词形还原等。此外,...

    Lucene 索引的简单使用

    - **分词器(Tokenizer)**:分词器将输入的文本分解为一系列的词语,这是建立索引的第一步。 - **分析器(Analyzer)**:分析器结合了分词器、过滤器等,负责对文本进行预处理,如去除停用词、词形还原等。 ### 2...

    lucene3源码分析

    - **第一步:用户输入查询语句**。 - **第二步:解析查询语句**。 - **词法分析**:识别查询语句中的关键词。 - **语法分析**:构建查询语句的语法树。 - **语言处理**:处理查询语句,使其适合于搜索操作。 - **...

    lucene练习代码

    Lucene的第一步通常是创建索引。以下是一段简单的示例代码,用于索引文本文件: ```java import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org....

    Lucene.Net-2.9.2 c#源码

    1. 分词器(Tokenizer):分词器是Lucene处理文本的第一步,负责将输入的字符串分解为一系列的词元(Token)。Lucene.Net包含多种预定义的分词器,如StandardAnalyzer用于英文,而ChineseAnalyzer适用于中文。 2. ...

    Annotated Lucene 中文版 Lucene源码剖析

    - 创建一个简单的索引,并进行基本的查询操作,这是入门Lucene的第一步。 - **Lucene Roadmap**: - 了解Lucene的发展历程及其未来规划对于开发者来说非常重要。 #### 索引文件结构 - **索引数据术语和约定**:...

    Lucene 2.0+Heriterx书源代码-ch7lib

    在信息检索领域,数据获取是至关重要的第一步,Heritrix能够帮助开发者高效地收集和存储网页内容,为后续的处理和分析提供原始数据。Heritrix与Lucene结合,可以实现从网页抓取到内容索引的完整流程。 压缩包中的...

    data.rar学习lucene需要的数据文件

    1. **创建索引**:这是Lucene的第一步,涉及对数据进行分析、分词,生成倒排索引。数据文件中的每个文件都会被读取,内容被分割成单词,然后每个单词与它出现的文件位置关联,形成索引。 2. **查询处理**:用户输入...

Global site tag (gtag.js) - Google Analytics