千家信息网

lucene4.7正则查询怎么实现

发表于:2024-12-05 作者:千家信息网编辑
千家信息网最后更新 2024年12月05日,这篇文章主要讲解了"lucene4.7正则查询怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"lucene4.7正则查询怎么实现"吧!lucen
千家信息网最后更新 2024年12月05日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正则查询怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0