千家信息网

lucene4.7正则查询怎么实现

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"lucene4.7正则查询怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"lucene4.7正则查询怎么实现"吧!lucen
千家信息网最后更新 2026年11月01日lucene4.7正则查询怎么实现

这篇文章主要讲解了"lucene4.7正则查询怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"lucene4.7正则查询怎么实现"吧!

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","并发");

结果如下:

命中数据 :2id=>2   name==>并发数据挑战面临巨大的挑战   author==>并发数据挑战面临巨大的挑战id=>4   name==>我们的并发数量并秦东亮在不不是很大   author==>我们的并发数量并秦东亮在不不是很大

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

 dao.testRegQuery("author","并发");

结果如下:

命中数据 :3id=>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","量并");

结果如下:

命中数据 :1id=>1   name==>the quick brown fox jumps over the lazy dog   author==>the quick brown fox jumps over the lazy dog命中数据 :1id=>4   name==>我们的并发数量并秦东亮在不不是很大   author==>我们的并发数量并秦东亮在不不是很大===========对比界限=============命中数据 :0命中数据 :0

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

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

     dao.testRegQuery("bookName","[fb]ox");//利用正则式检索

结果如下:

命中数据 :2id=>1   name==>the quick brown fox jumps over the lazy dog   author==>the quick brown fox jumps over the lazy dogid=>5   name==>log is small box   author==>log is small box

感谢各位的阅读,以上就是"lucene4.7正则查询怎么实现"的内容了,经过本文的学习后,相信大家对lucene4.7正则查询怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

查询 正则 数据 字段 结果 很大 数量 代码 巨大 内容 方式 散仙 检索 测试 边界 通配符 问题 学习 强大 两个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海卓越科技互联网 安徽鑫晟辉互联网科技 成都互联网科技公司 善班互联网科技有限公司 新华互联网科技校企合作 成都玖崟互联网科技有限公司乐商圈怎么样 北京大学互联网科技怎么样 福州新华互联网科技学校 知乎 小米互联网科技园设置 欧洲十大科技互联网公司 成都铂石互联网科技做什么的 畅思互联网科技 互联网数据科技专业 互联网科技圈年度人物 互联网企业科技类企业如何做账 南京一网一红互联网科技有限公司 抖集互联网科技技术咨询 广州梦谷互联网科技有限公司领导 互联网时代高科技布局 10位科技互联网大佬 上海挚品互联网科技 贷财互联网科技 互联网科技上市公司 互联网科技股有哪些 丰台科技园 互联网公司 互联网科技创新企业排名 中国最先进互联网科技公司 互联网教育科技公司vipkid 为客找房互联网科技公司怎么样 杭州融税互联网科技有限公司
0