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();
}
}
分享到:
相关推荐
标题中的“lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用”指出,这个主题将探讨如何在Lucene中应用IKAnalyzer进行中文分词,以及如何使用高亮器(highlighter)来突出搜索结果中的关键词。Lucene是...
本篇文章将带你迈出使用Lucene的第一步,重点关注如何实现分页检索,这对于构建高效、用户友好的搜索系统至关重要。 Lucene的核心功能包括文档索引、查询解析和结果排序。在分页检索方面,我们需要考虑如何有效地...
在自然语言处理领域,文本分词是至关重要的第一步,它涉及到对一段文本进行细粒度的分析,将连续的字符序列分割成具有独立语义的词汇单元,为后续的语义理解、情感分析、信息检索等任务提供基础。在您提供的资源中,...
- **Analyzer**:文本分析器是Lucene处理文本的第一步,它负责将输入的字符串分解为一系列的词项(tokens)。在5.2.1版本中,包括了`StandardAnalyzer`和`SimpleAnalyzer`等,适用于不同语言和应用场景。 2. **...
文本分析是Lucene处理文本数据的第一步,它涉及到文本的分词、去除停用词、词形还原等一系列操作,目的是将复杂的自然语言转化为搜索引擎可以理解和处理的形式。 在"lucene-analysis.jar"中,我们可以找到多种预定...
这个“lucene基本包”是探索和学习Lucene的第一步,其中可能包含了Lucene的JAR文件和其他必要的资源,供开发者在实际项目中导入和使用。通过深入理解并实践这些核心概念和功能,开发者可以充分利用Lucene的强大能力...
1. **创建索引**:这是Lucene工作的第一步,它会把文档内容解析成一系列的术语(tokens),然后为每个术语建立倒排索引。倒排索引是一种数据结构,它允许快速查找包含特定术语的文档。 2. **索引写入**:在创建索引...
7. **API接口设计**:理解C Lucene提供的API接口,如何调用它们进行索引构建和搜索操作,是使用C Lucene的第一步。 总的来说,C Lucene为开发者提供了一个在C语言环境中实现高效全文搜索的途径,虽然它可能带来额外...
分词是自然语言处理的第一步,它将连续的文本流分解成单独的词语,以便进一步分析和处理。在中文中,由于没有明显的空格分隔,分词显得尤为复杂。传统的Lucene使用标准分词器(StandardAnalyzer),它主要依据词频...
1. **索引(Indexing)**:这是Lucene的第一步,它将文档内容转换成可供搜索的索引。核心类`IndexWriter`负责创建和更新索引,它可以处理大量的文档,并通过`Analyzer`进行文本分词。`Analyzer`是Lucene中的关键角色...
构建索引是Lucene的第一步,涉及到对文本的预处理,如分词、去除停用词等。在Windows环境中,开发者可以使用Lucene提供的Analyzer类对输入的文本进行分析,然后使用IndexWriter创建索引。 5. **查询与搜索** ...
3. 分词器(Tokenizer):将输入的文本分割成一系列的词汇单元,这是建立索引的第一步。 4. 分词过滤器(TokenFilter):进一步处理分词器生成的词汇,例如去除停用词、词形还原等。 5. 索引(Index): Lucene将...
索引构建是Lucene的第一步,它将文本数据转换为可快速检索的结构。通过分词器(Tokenizer)和过滤器(Filter),Lucene能够处理中文文本,将句子拆分成关键词,并进行标准化处理,如去除停用词、词形还原等。此外,...
- **分词器(Tokenizer)**:分词器将输入的文本分解为一系列的词语,这是建立索引的第一步。 - **分析器(Analyzer)**:分析器结合了分词器、过滤器等,负责对文本进行预处理,如去除停用词、词形还原等。 ### 2...
- **第一步:用户输入查询语句**。 - **第二步:解析查询语句**。 - **词法分析**:识别查询语句中的关键词。 - **语法分析**:构建查询语句的语法树。 - **语言处理**:处理查询语句,使其适合于搜索操作。 - **...
Lucene的第一步通常是创建索引。以下是一段简单的示例代码,用于索引文本文件: ```java import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org....
1. 分词器(Tokenizer):分词器是Lucene处理文本的第一步,负责将输入的字符串分解为一系列的词元(Token)。Lucene.Net包含多种预定义的分词器,如StandardAnalyzer用于英文,而ChineseAnalyzer适用于中文。 2. ...
- 创建一个简单的索引,并进行基本的查询操作,这是入门Lucene的第一步。 - **Lucene Roadmap**: - 了解Lucene的发展历程及其未来规划对于开发者来说非常重要。 #### 索引文件结构 - **索引数据术语和约定**:...
在信息检索领域,数据获取是至关重要的第一步,Heritrix能够帮助开发者高效地收集和存储网页内容,为后续的处理和分析提供原始数据。Heritrix与Lucene结合,可以实现从网页抓取到内容索引的完整流程。 压缩包中的...
1. **创建索引**:这是Lucene的第一步,涉及对数据进行分析、分词,生成倒排索引。数据文件中的每个文件都会被读取,内容被分割成单词,然后每个单词与它出现的文件位置关联,形成索引。 2. **查询处理**:用户输入...