一、简单说明
可以参考学习的博客文章:这两篇文章写得都很详细,我就不一一再解释了,就是换一下版本,新版本官方说只需要4个jar就可以了,我只用了三个,Demo那个我也没有引入,分词器我也用的是IK,然后在找了一篇文章是解释说明分词器的,因为本人也是新手,有什么错误的还请各位大神指教,并且本人刚入行(java),一直没有学习的思路,如果有哪位愿意不吝赐教,请随意私信或者评论,我一定虚心接受。
所有说到的文章链接:http://blog.csdn.net/lkx94/article/details/44260081
http://blog.csdn.net/joker233/article/details/51909565
http://blog.liuxianan.com/lucene-hello-world.html
官方链接:http://lucene.apache.org/core/7_0_1/core/index.html
二、项目依赖
官方原话:
Setting your CLASSPATH
First, you should download the latest Lucene distribution and then extract it to a working directory.
You need four JARs: the Lucene JAR, the queryparser JAR, the common analysis JAR, and the Lucene demo JAR. You should see the Lucene JAR file in the core/ directory you created when you extracted the archive -- it should be named something like lucene-core-{version}.jar. You should also see files called lucene-queryparser-{version}.jar, lucene-analyzers-common-{version}.jar and lucene-demo-{version}.jar under queryparser, analysis/common/ and demo/, respectively.
Put all four of these files in your Java CLASSPATH.
这里就是说只需要四个jar,而我用了3个,没有用Demo那个jar
我也用了Maven去建立项目,但是发现maven下载了很多个包,所以我也不知道那些事用到的,那些是没有用到,所以就直接按照官网说需要什么jar就建立一个web项目自己添加。
三、项目实现思路
四、代码实现和详细解释
package Demo;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.RAMDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;
public class Demo1 {
public static void main(String[] args) {
/**
* 创建索引
*/
//创建一个Directory的磁盘目录对象,用来存放索引的文件
RAMDirectory directory = new RAMDirectory();
//创建简单中文分析器 创建索引使用的分词器必须和查询时候使用的分词器一样,否则查询不到想要的结果
Analyzer analyzer = new IKAnalyzer(true);
//实例化索引配置,用来存放分析器
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
//实例化索引写入对象
IndexWriter indexWriter;
try {
indexWriter = new IndexWriter(directory, indexWriterConfig);
// 清除以前的index
indexWriter.deleteAll();
//创建Document 文档对象
Document document = new Document();
/*
* 参数说明 public Field(String name, String value, FieldType type)
* name : 字段名称
* value : 字段的值 store :
* TextField.TYPE_STORED:存储字段值
*/
document.add(new Field("name", "lin zhengle", TextField.TYPE_STORED));
document.add(new Field("address", "中国上海", TextField.TYPE_STORED));
document.add(new Field("dosometing", "I am learning lucene ",TextField.TYPE_STORED));
indexWriter.addDocument(document);
indexWriter.close(); //关闭
} catch (IOException e) {
e.printStackTrace();
}
/**
* 搜索
*/
// 因为索引放在内存中,所以存放进去之后要立马测试,否则,关闭应用程序之后就检索不到了
// 创建IndexSearcher 检索索引的对象,里面要传递上面写入的内存目录对象directory
try {
DirectoryReader directoryReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(directoryReader);
String[] fields = {"name", "address","dosometing"}; // 要搜索的字段,一般搜索时都不会只搜索一个字段
// 字段之间的与或非关系,MUST表示and,MUST_NOT表示not,SHOULD表示or,有几个fields就必须有几个clauses
BooleanClause.Occur[] clauses = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};
// MultiFieldQueryParser表示多个域解析, 同时可以解析含空格的字符串,如果我们搜索"上海 中国"
// 创建搜索的Query
Query multiFieldQuery = MultiFieldQueryParser.parse("中国", fields, clauses, analyzer);
// 根据searcher搜索并且返回TopDocs
TopDocs topDocs = indexSearcher.search(multiFieldQuery, 100); // 搜索前100条结果
System.out.println("共找到匹配处:" + topDocs.totalHits); // totalHits和scoreDocs.length的区别还没搞明白
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}