转载请注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/1972785
不知不觉,已经又过去一个多月了,lucene已经更新到4.5.1的版本了,散仙这段时间在研究hadoop方面的知识,lucene系列的文章已经一个月没更新了,不过,散仙的核心还在lucene上,后面会尽量抽出时间,持续更新lucene系列博文。
散仙今天要分享的是关于lucene中另外一种丰富的查询方式----正则查询,lucene内置了许多的查询API,以及更强大的自定义查询方式的QueryParse,大部分情况下我们使用内置的查询API,基本上就可以满足我们的需求了,但是如果你想更灵活的定制自己的查询或者改写自己的查询API那么你完全可以继承QueryParse类来完成这项工作。
从某种方式上来说,正则查询(RegexpQuery)跟通配符查询(WildcardQuery)的功能很相似,因为他们都可以完成一样的工作,但是不同的是正则查询支持更灵活定制细化查询,这一点与通配符的泛化是不一样的,而且正则查询天生支持使用强大的正则表达式的来准确匹配一个或几个term,需要注意的是,使用正则查询的字段最好是不分词的,因为分词的字段可能会导致边界问题,从而使查询失败,得不到任何结果,这一点和WildcardQuery效果是一样的。
下面先来看一下,散仙的测试数据,为了看出分词与不分词给查询造成的影响,散仙的用同样的内容做测试,分词工具使用的是IK的分词器,截图如下:
在上图中,散仙使用2个字段存储一样的内容,一个是分过词的,一个没分过词的,下面给出使用正则查询的核心代码:
RegexpQuery query=new RegexpQuery(new Term(field, ".*"+searchStr+".*"));
// System.out.println(query.toString());
TopDocs s=search.search(query,null, 100);
// TopDocs s=search.search(bool,null, 100);
System.out.println(s.totalHits);
for(ScoreDoc ss:s.scoreDocs){
Document docs=search.doc(ss.doc);
System.out.println("id=>"+docs.get("id")+" name==>"+docs.get("bookName")+" author==>"+docs.get("author"));
// System.out.println(docs.get(field));
}
下面我们先来测,对不分词的字段的做模糊查询,测试的代码如下:
dao.testRegQuery("bookName","并发");
结果如下:
命中数据 :2
id=>2 name==>并发数据挑战面临巨大的挑战 author==>并发数据挑战面临巨大的挑战
id=>4 name==>我们的并发数量并秦东亮在不不是很大 author==>我们的并发数量并秦东亮在不不是很大
我们发现它很出色完成了模糊的查询,并且耗时比通配符查询同样的查询条件的耗时要少,下面我们对分词的字段,进行检索,测试代码如下:
dao.testRegQuery("author","并发");
结果如下:
命中数据 :3
id=>2 name==>并发数据挑战面临巨大的挑战 author==>并发数据挑战面临巨大的挑战
id=>3 name==>the food is perfect! author==>我们的并发数量并不是很大
id=>4 name==>我们的并发数量并秦东亮在不不是很大 author==>我们的并发数量并秦东亮在不不是很大
我们发现对分词字段的模糊匹配,也同样没问题,下面我们来测下对分词字段的边界查询。代码如下:
dao.testRegQuery("bookName","e q");
dao.testRegQuery("bookName","量并");
System.out.println("===========对比界限=============");
dao.testRegQuery("author","e q");
dao.testRegQuery("author","量并");
结果如下:
命中数据 :1
id=>1 name==>the quick brown fox jumps over the lazy dog author==>the quick brown fox jumps over the lazy dog
命中数据 :1
id=>4 name==>我们的并发数量并秦东亮在不不是很大 author==>我们的并发数量并秦东亮在不不是很大
===========对比界限=============
命中数据 :0
命中数据 :0
由以上结果,我们可以发现分词后的字段,如果在某个字之间被切分成两个term,那么无论你用什么样的方式模糊这两个term边界之间的数据,都查询不到任何结果,而不分词的字段,却能查出来,这是因为,不分词的字段都是作为一个单独的term来处理的,来lucene的内部匹配方式,恰恰又是以term作为最小检索单位的,故能检索到结果,这一点需要我们格外注意,在实现我们的业务时,要根据自己的场景来设计出最优的分词策略。
下面散仙要测的是正则查询的老本行了,使用正则表达式进行查询,代码如下:
dao.testRegQuery("bookName","[fb]ox");//利用正则式检索
结果如下:
命中数据 :2
id=>1 name==>the quick brown fox jumps over the lazy dog author==>the quick brown fox jumps over the lazy dog
id=>5 name==>log is small box author==>log is small box
我们发现含有fox,box的两条数据都被正确的检索出来了,其实散仙检索的条件,在匹配时会被分解成4个条件,分别是,fox,fo,box,bo只要含有这几个term的数据,都会被检索出来,而这一点恰恰省去了,我们在使用其他的查询时使用OR或者AND进行拼接的繁琐,也可以简化成所谓的SQL里面的IN查询,当然使用正则表达式查询方式可以有很多种,散仙在这里只是简单的举了个例子,有兴趣的朋友们,可以自己测测。
最后在总结一下,1,如果是在不分词的字段里做模糊检索,优先使用正则查询的方式会比其他的模糊方式性能要快。2,在查询的时候,应该注意分词字段的边界问题。3,在使用OR或AND拼接条件查询时或一些特别复杂的匹配时,也应优先使用正则查询。4,大数据检索时,性能尤为重要,注意应避免使用前置模糊的方式,无论是正则查询还是通配符查询。
转载请注明,原创地址,谢谢配合!
http://qindongliang1922.iteye.com/blog/1972785
- 大小: 140.1 KB
分享到:
相关推荐
在"lucene4.3 按坐标距离排序"这个主题中,我们将探讨如何在Lucene 4.3版本中利用地理位置信息进行文档排序,特别是在处理地理空间搜索时的应用。 首先,Lucene 4.3引入了对地理空间搜索的支持,这允许我们根据地理...
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会...
lucene4.3增删改查的的一个工具类,对新手来说是一份不可多得的入门资料。
全文检索lucene 4.3 所用到的3个jar包,包含lucene-queryparser-4.3.0.jar、 lucene-core-4.3.0.jar、lucene-analyzers-common-4.3.0.jar。
lucene4.3源代码 censed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information ...
Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。在Java编程环境中,它为开发者提供了强大的文本检索功能,使得在海量数据中快速查找相关信息变得简单易行。本篇文章将详细探讨Lucene 4.3.1版本的...
1.XunTa是在lucene4.3上创建的通过“知识点”来找人的搜人引擎。 输入一个关键词(或组合),XunTa返回一个排名列表,排在前面的人是与该关键词(组合)最相关的“达人”。 可访问 http://www.xunta.so立即体验...
本文将深入探讨IKAnalyzer的特性和其在Lucene 4.3中的兼容性问题及其解决方案。 **IKAnalyzer简介** IKAnalyzer( Intelligent Keyword Analyzer)是一款基于Java实现的中文分词工具,它主要针对中文的特性进行了...
《基于Lucene的JavaEE项目开发详解》 在信息技术领域,搜索引擎已经成为不可或缺的一部分,而Lucene作为开源全文搜索引擎库,以其高效、灵活的特点被广泛应用于各种JavaEE项目中。本项目将深入探讨如何利用Lucene...
Lucene3.4开发入门.pdf
**Lucene.net 开发完全指南** Lucene.net 是一个开源的全文搜索引擎库,它是 Apache Lucene 的 .NET 版本,适用于 .NET 平台。Lucene.net 提供了高效、可扩展的搜索功能,广泛应用于网站内容检索、文档搜索、数据库...
《Lucene2.9开发指南》是一份专为初级开发者准备的资料,旨在详细介绍如何使用开源全文搜索工具包Lucene2.9.1。Lucene作为一个强大的文本搜索库,其核心功能包括建立索引和执行搜索。以下是关于Lucene2.9开发的一些...
Lucene.Net的设计理念是将复杂的搜索引擎技术封装在简单易用的API之下,使得开发者可以专注于应用逻辑,而无需深入理解搜索引擎的底层原理。 在这个个人知识库项目中,开发者可能已经实现了以下关键功能: 1. **...
【Lucene开发手册】 Lucene是一个开源的全文检索库,由Apache软件基金会开发,主要用Java编写。作为一套API,Lucene提供了构建高效、可扩展的搜索引擎所需的核心工具。它并非一个完整的搜索引擎产品,而是一个搜索...
《Lucene搜索引擎开发权威经典》是由于天恩编著的一本深入探讨Lucene搜索引擎开发的专业书籍,这本书结合源码分析,旨在帮助读者掌握Lucene的核心技术和应用实践。Lucene是Apache软件基金会的一个开放源代码项目,它...
### Lucene开发详解 #### 一、Lucene简介 Lucene是一个高性能、全功能的文本搜索引擎库,由Doug Cutting创建并捐赠给Apache Software Foundation。它主要用于构建全文搜索应用程序,能够帮助开发者快速地在其应用...
Lucene 是一个高性能、全文本搜索库,广泛应用于开发全文检索系统。要理解Lucene的开发流程,我们首先需要了解其基本概念和步骤。以下是对Lucene开发流程的详细说明: 1. **数据获取**: 开发流程的第一步是从各种...
《Apache Lucene 6.6 开发详解》 Apache Lucene 是一个开源全文搜索引擎库,由Java编写,设计为高性能、可扩展的信息检索应用程序。它提供了丰富的搜索功能,包括索引、查询、排序等,被广泛应用于各种信息管理和...
《Lucene开发指南》是一份综合性的学习资料,旨在帮助开发者深入理解和熟练运用Apache Lucene这一强大的全文搜索引擎库。Lucene是Java语言实现的开源项目,广泛应用于信息检索、数据分析和大数据处理等领域。本指南...
**Lucene 开发包详解** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。这个开发包包含了两个版本:lucene-1.4.3 和 lucene-1.4.1,分别代表了 Lucene 的不同迭代阶段,它们为开发者提供了...