Lucene快速入门(二)

三、lucene入门实例:搜索索引

搜索索引作为Lucene两大基本操作之一,涉及到很多具体的搜索设置,这里先用一个简单的搜索实例来展示lucene的搜索功能,代码如下: 

public void query() throws ParseException, CorruptIndexException, IOException {
	String queryStr = "lucene"; // 要查询的文本
	// 1.把查询文本解析成Query对象
	String[] fields = { "fileName", "fileContent" };
	QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, fields, analyzer);
	Query query = queryParser.parse(queryStr);
	System.out.println("Query对象格式:" + query);
	// 2.开始查询
	long start = System.currentTimeMillis();
	IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File(indexDir)));
	TopDocs topDocs = searcher.search(query, 10000);
	System.out.println("共计查询到:" + topDocs.totalHits + " 条结果,用时" + (System.currentTimeMillis() - start)+ "毫秒");
	for (ScoreDoc scoreDoc : topDocs.scoreDocs) {// 打印查询结果
		int docSN = scoreDoc.doc; // 文档内部编号
		Document doc = searcher.doc(docSN); // 根据文档内部编号取出文档
	System.out.println("fileName=" + doc.get("fileName") + "\t fileSize=" + doc.get("fileSize")+ "\t fileContent=" +doc.get("fileContent") + "\t filePath=" + doc.get("filePath"));
	}
}

 

简析IndexSearcher作用就是完成对索引的搜索,但是搜索前必须传递一个Query对象。为什么要传递Query对象而不是传递一个字串直接进行搜索,首先要明确lucene创建索引中用到了字段域,其次要明确一份文档可能有很多字段域组成,搜索时不可能对每个字段域都进行搜索,最后要明确Query对象实质就是字段域信息(打印Query对象可以看出),即是说把搜索字串和字段域的名称相结合构造了字段域。明确了以上三点就不难理解Query对象的创建。搜索结果集TopDocs对象,此对象持有两个重要信息:一是查询到的总记录数,二是查询到记录数的集合(Document对象的集合),类似于数据库查询结果的封装。需要特别说明的是ScoreDoc对象并不是一个真正Document对象,它只是记录了文档对象的编号,要想获取Document对象,还需使用IndexSearcher类的doc方法来查出对应的Document对象。得到了Document对象,就可以获取字段域及查询到的信息。

总结查询三个关键对象:Query对象、IndexWriter对象、TopDocs对象

 

四、分词器

1.词的定义

词是经过分词器处理后的字串,更具体地说词是经过分词器以下四大操作而形成的字串:

1)关键词切分:对于英文来说每个单词就是一个关键词,而中文分词会根据一个词典来对关键词进行切分,不同的分词器对词的切分可能不同。

2)去除停用词:停用词是指一些出现频率较高,但是没有实际意义的词,比如英文中的“a an the”等,中文中的“的了着”等。

3)词形还原:主要是指把英文中的单词进行去尾操作,如现在分词、过去分词还原成词根形式,复数单词转为单数形式。

4)转为小写:把所有英文字母全部转成小写字母。

经过以上4步操作后得到的结果称为词元(Token),这些词元共同构成了词。

2.分词结果

为了能看清分词器分词后的效果,我们可以使用如下代码来测试。

public class AnalyzerTest {
	String enText = "Look, This's my first test about Lucene,Thanks.";
	String zhText = "瞧,这是我第一次lucene相关的练习,谢谢。";
	String zhText2 = "这是我的第一次关于lucene的练习。";
	Analyzer an = new StandardAnalyzer(Version.LUCENE_30);
Analyzer an2 = new CJKAnalyzer(Version.LUCENE_30);
// 二分法分词器:如“大家好啊”分词结果为:大家、家好、好啊
Analyzer an3 = new IKAnalyzer(); 
// IK分词器作者JE博客地址:linliangyi2007.iteye.com

	@Test
	public void testAnaly() throws IOException {
		printAnalyzerResult(an, enText);
		printAnalyzerResult(an2, zhText);
		printAnalyzerResult(an3, zhText);
		printAnalyzerResult(an3, zhText2);
	}

	public void printAnalyzerResult(Analyzer analyzer, String text) throws IOException {
System.out.println("分词器:" + analyzer.getClass().getName());
		Reader reader = new StringReader(text);
		TokenStream ts = analyzer.tokenStream("result", reader);	
		while (ts.incrementToken()) {
			System.out.println("词元信息:"+ts);
		}
	}
}

 

简析:TokenStream是词元的集合(A TokenStream enumerates the sequence of tokens),即是说它包含分词后的所有结果词元。我们也可根据TokenStream来构建一个字段域Field对象,如:Field field = new Field("result",ts); 从分词结果中打印的词元信息我们可以验证“分词器对词进行的四大操作”。

3.由分词引发的问题

1)使用相同分词器:创建索引时使用的分词器要和搜索时构建Query对象使用分词器相同。(2)在查询时英文字母还原为小写,这一步通常我们不需要关注,因为再把把查询文本解析成Query对象时,分词器会帮我们完成。(3)分词器的选择应以业务而定,也可以根据业务来实现特定的分词器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值