Lucene 7.0测试使用

一、简单说明

可以参考学习的博客文章:这两篇文章写得都很详细,我就不一一再解释了,就是换一下版本,新版本官方说只需要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}.jarlucene-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项目自己添加。


三、项目实现思路

luence实现就是两步:一、建立索引。二,通过检索索引找到内容

一、建立索引
1、创建一个Directory的磁盘目录对象,用来存放需要检索的文件

很多测试的例子都是创建一个 RAMDirectory,即内存目录对象,是把需要检索的文件放在内存中,而不是磁盘中,这样一旦关闭程序就没了。而且缺点是数据量大了就卡了,不过测试一般都是很少数据。
我的例子会直接创建一个磁盘目录对象Directory,拿到我存放在系统的的文件目录,去读取文件

2、创建一个分词器对象,用来分析的

官方用的比较不好,现在中文一般都是用IKAnalyzer,也在网上看了一些其他的,没试过。

3、创建一个索引编辑器配置IndexWriterConfig

4、实例化索引编辑器IndexWriter

5、创建Document 文档对象,就是索引文件

6,将索引文件放到索引编辑器中,索引建立完成

二、查询
简单查询一个字段就直接建立一个Query去查询即可,官方例子就是

而一般我们都是要查询几个字段,查询某一些信息,以下例子是查询三个字段的
1、建立一个String[]数组,添加入需要搜索的字段

2、建一个字段之间的BooleanClause.Occur[],保存字段之间的关系

3、建立一个Query查询,用MultiFieldQueryParser解析

4、TopDocs接收查询结果

四、代码实现和详细解释

解释其实不算我自己的,我发现我的表达能力一般,所以很多都是参照别人,觉得可以我就注释上去。
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();
		}  

	}

}

五、总结回顾

这篇文章纯粹是记录自己怎么学习使用一个新版本的lucene,发现新版本和旧版本的luceneAPI没有改变,起码我用的那些API都没有变化,后续我会写一篇获取系统文件,然后读取各种文件,然后查询的lucene,也是基础使用篇。针对记录自己学习情况。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值