`
weitao1026
  • 浏览: 1048320 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lucene中另外一种丰富的查询方式----正则查询

阅读更多
关于lucene中另外一种丰富的查询方式----正则查询,lucene内置了许多的查询API,以及更强大的自定义查询方式的QueryParse,大部分情况下我们使用内置的查询API,基本上就可以满足我们的需求了,但是如果你想更灵活的定制自己的查询或者改写自己的查询API那么你完全可以继承QueryParse类来完成这项工作。


从某种方式上来说,正则查询(RegexpQuery)跟通配符查询(WildcardQuery)的功能很相似,因为他们都可以完成一样的工作,但是不同的是正则查询支持更灵活定制细化查询,这一点与通配符的泛化是不一样的,而且正则查询天生支持使用强大的正则表达式的来准确匹配一个或几个term,需要注意的是,使用正则查询的字段最好是不分词的,因为分词的字段可能会导致边界问题,从而使查询失败,得不到任何结果,这一点和WildcardQuery效果是一样的。

下面先来看一下,散仙的测试数据,为了看出分词与不分词给查询造成的影响,散仙的用同样的内容做测试,分词工具使用的是IK的分词器,截图如下:



在上图中,散仙使用2个字段存储一样的内容,一个是分过词的,一个没分过词的,下面给出使用正则查询的核心代码:



Java代码 复制代码 收藏代码
1.RegexpQuery query=new RegexpQuery(new Term(field, ".*"+searchStr+".*")); 
2.              // System.out.println(query.toString()); 
3.              TopDocs s=search.search(query,null, 100); 
4.            //  TopDocs s=search.search(bool,null, 100); 
5.               System.out.println(s.totalHits); 
6.              for(ScoreDoc ss:s.scoreDocs){ 
7.                      
8.                     Document docs=search.doc(ss.doc); 
9.                     System.out.println("id=>"+docs.get("id")+"   name==>"+docs.get("bookName")+"   author==>"+docs.get("author")); 
10.                // System.out.println(docs.get(field)); 
11.                 } 



下面我们先来测,对不分词的字段的做模糊查询,测试的代码如下:



Java代码 复制代码 收藏代码
1.dao.testRegQuery("bookName","并发"); 



结果如下:



Java代码 复制代码 收藏代码
1.命中数据 :2 
2.id=>2   name==>并发数据挑战面临巨大的挑战   author==>并发数据挑战面临巨大的挑战 
3.id=>4   name==>我们的并发数量并秦东亮在不不是很大   author==>我们的并发数量并秦东亮在不不是很大 


我们发现它很出色完成了模糊的查询,并且耗时比通配符查询同样的查询条件的耗时要少,下面我们对分词的字段,进行检索,测试代码如下:



Java代码 复制代码 收藏代码
1.dao.testRegQuery("author","并发"); 


结果如下:



Java代码 复制代码 收藏代码
1.命中数据 :3 
2.id=>2   name==>并发数据挑战面临巨大的挑战   author==>并发数据挑战面临巨大的挑战 
3.id=>3   name==>the food is perfect!   author==>我们的并发数量并不是很大 
4.id=>4   name==>我们的并发数量并秦东亮在不不是很大   author==>我们的并发数量并秦东亮在不不是很大 


我们发现对分词字段的模糊匹配,也同样没问题,下面我们来测下对分词字段的边界查询。代码如下:



Java代码 复制代码 收藏代码
1.dao.testRegQuery("bookName","e q"); 
2.     dao.testRegQuery("bookName","量并"); 
3.     System.out.println("===========对比界限============="); 
4.     dao.testRegQuery("author","e q"); 
5.     dao.testRegQuery("author","量并"); 


结果如下:



Java代码 复制代码 收藏代码
1.命中数据 :1 
2.id=>1   name==>the quick brown fox jumps over the lazy dog   author==>the quick brown fox jumps over the lazy dog 
3.命中数据 :1 
4.id=>4   name==>我们的并发数量并秦东亮在不不是很大   author==>我们的并发数量并秦东亮在不不是很大 
5.===========对比界限============= 
6.命中数据 :0 
7.命中数据 :0 


由以上结果,我们可以发现分词后的字段,如果在某个字之间被切分成两个term,那么无论你用什么样的方式模糊这两个term边界之间的数据,都查询不到任何结果,而不分词的字段,却能查出来,这是因为,不分词的字段都是作为一个单独的term来处理的,来lucene的内部匹配方式,恰恰又是以term作为最小检索单位的,故能检索到结果,这一点需要我们格外注意,在实现我们的业务时,要根据自己的场景来设计出最优的分词策略。

下面散仙要测的是正则查询的老本行了,使用正则表达式进行查询,代码如下:



Java代码 复制代码 收藏代码
1.dao.testRegQuery("bookName","[fb]ox");//利用正则式检索 


结果如下:



Java代码 复制代码 收藏代码
1.命中数据 :2 
2.id=>1   name==>the quick brown fox jumps over the lazy dog   author==>the quick brown fox jumps over the lazy dog 
3.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,大数据检索时,性能尤为重要,注意应避免使用前置模糊的方式,无论是正则查询还是通配符查询。
分享到:
评论

相关推荐

    一个专业搜索公司关于lucene+solar资料(1)

    - Lucene是一种高性能的全文检索引擎,支持复杂的查询语法。 - 索引结构包括倒排索引等,能够高效地处理大量文本数据。 - **2.2.3 Lucene全文检索引擎** - Lucene是Apache基金会的一个开源项目,提供了强大的...

    Lucene的应用

    倒排索引是一种高效的索引数据结构,用于快速定位包含特定词汇的文档。在Lucene中,倒排索引的构建过程包括以下几个步骤: 1. **文档分析**:对输入文档进行分词处理,提取出有意义的词汇。 2. **索引创建**:为每...

    解密搜索引擎技术实战:Lucene&Java精华版

    - **3.1.5 使用正则表达式提取数据**:介绍了正则表达式在数据抽取中的应用。 - **3.1.6 结构化信息提取**:探讨了如何从HTML文档中提取结构化数据。 - **3.1.7 网页的DOM结构**:讲解了DOM树的概念及其在网页...

    基于Java和数据库的图片文字模糊查询,毕业设计的一部分.zip

    - **基础语法**:Java是一种广泛使用的面向对象编程语言,其语法严谨,具有丰富的类库。项目中可能使用了面向对象的设计原则,如封装、继承和多态。 - **Swing或JavaFX**:这两个是Java的图形用户界面(GUI)框架...

    beagle:Beagle可帮助您识别文本文档流中感兴趣的关键字,短语,正则表达式和复杂的搜索查询

    Beagle旨在提供一种高效的方式,使得用户能快速定位和提取信息,尤其适用于大数据量的文本分析场景。 **Java技术背景** Beagle很可能基于Java开发,因为Java是一种广泛用于构建高性能、跨平台的服务器端应用的编程...

    日志服务数据加工培训第二讲_DSL核心语法介绍.pdf

    - Grok模式:一种正则表达式模板,用于从复杂文本中提取结构化数据。 - 查询字符串语法:类Lucene的语法,用于高效地搜索和筛选日志事件。 总结来说,日志服务数据加工DSL是一种强大的工具,通过其丰富的语法和...

    aduna-commons-text-2.1.jar.zip

    8. **TF-IDF(Term Frequency-Inverse Document Frequency)**:这是一种衡量词的重要性相对于文档集合的方法,常用于信息检索和文本分类。 在实际应用中,Aduna Commons Text 2.1通常与其他Java库结合使用,如...

    JAVA笔记JAVA笔记.docx

    - 增强的for循环(也称为“foreach”循环)是一种简化遍历容器元素的方式,语法如下: ```java for (Type element : collection) { // 处理element } ``` - **Collections工具类**: - `Collections`类提供...

    百度搜索代码解析

    这些库提供了丰富的API,允许我们构建倒排索引,这是一种能够高效地进行关键词查找的数据结构。在Java中,我们需要定义一个文档模型,包含网页的URL、标题、内容等信息,然后将这些信息添加到索引中。 查询处理涉及...

    史上最难PHPer测试题与其答案

    - **题目解析**:表驱动法是一种常见的编程模式,主要用于根据表格中的数据进行决策,而不是使用复杂的逻辑语句。这种方式在处理大量数据时非常有效,可以减少代码的复杂度。 #### 19. Solr 搜索引擎 - **题目解析...

    黑马面试宝典知识点复习

    - **定义**:一种安全漏洞,攻击者可以通过在SQL查询中插入恶意SQL语句来控制数据库服务器执行非授权操作。 - **防御措施**:参数化查询、预编译语句、使用ORM框架等。 #### SQL Select语句完整的执行顺序 1. **...

    齐鲁软件设计大赛作品简介

    该系统旨在提供一种高效的网络资源检索解决方案,帮助用户快速准确地找到所需的信息资源。 ##### 3. 定义 - **软件结构**:指根据功能需求对软件进行的模块划分,每个模块负责特定的功能,模块之间通过接口进行通信...

    程序员 杂志\03-01.pdf

    .NET框架的CodeDOM(Code Document Object Model)对象模型提供了一种在多种语言中编写代码的方法,这对于创建可复用的代码模板非常有用。通过使用System.CodeDom和System.CodeDom.Compiler命名空间,开发者可以快速...

    一个简单的asp.net引擎搜索(多多的指导啊)

    ASP.NET 是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和工具,使得开发者能够高效地构建动态、数据驱动的网站。在这个“一个简单的ASP.NET引擎搜索”项目中,我们将探讨如何在ASP.NET环境中实现...

    asp.net 站内搜索

    Lucene.NET提供高效的全文检索功能,而SQL Server Full-Text Search则更适用于已存储在SQL数据库中的数据,Elasticsearch则是一个分布式、实时的搜索和分析引擎,适用于大数据量的需求。 二、搜索索引构建 无论选择...

    Apache java项目全介绍

    它提供了一种简单的方式来管理项目的构建、测试和部署。 - **特点**: Ant支持多种构建任务,如编译、打包和部署等,并且可以轻松地与其他工具集成。 ##### 2. Avalon - **简介**: Avalon是一个轻量级的应用程序框架...

    Java基础入门教程

    Java作为一种强大的编程语言,不仅适用于桌面应用、Web应用和移动应用开发,而且拥有丰富的学习资源和支持社区。学习Java不仅可以帮助程序员掌握面向对象编程的核心概念,还能应用于各种实际项目中。通过系统的教程...

    搜索引擎.NET_搜索链接应用程序.rar

    .NET框架为开发者提供了一种强大的工具集,用于构建这样的应用程序。本教程将深入探讨如何利用.NET技术来创建一个搜索链接的应用程序。 一、.NET框架基础 .NET框架是由微软开发的开源开发平台,它提供了丰富的类库...

Global site tag (gtag.js) - Google Analytics