今天要分享的是关于lucene中另外一种丰富的查询方式----正则查询,lucene内置了许多的查询API,以及更强大的自定义查询方式的QueryParse,大部分情况下我们使用内置的查询API,基本上就可以满足我们的需求了,但是如果你想更灵活的定制自己的查询或者改写自己的查询API那么你完全可以继承QueryParse类来完成这项工作。
从某种方式上来说,正则查询(RegexpQuery)跟通配符查询(WildcardQuery)的功能很相似,因为他们都可以完成一样的工作,但是不同的是正则查询支持更灵活定制细化查询,这一点与通配符的泛化是不一样的,而且正则查询天生支持使用强大的正则表达式的来准确匹配一个或几个term,需要注意的是,使用正则查询的字段最好是不分词的,因为分词的字段可能会导致边界问题,从而使查询失败,得不到任何结果,这一点和WildcardQuery效果是一样的。
下面先来看一下,散仙的测试数据,为了看出分词与不分词给查询造成的影响,散仙的用同样的内容做测试,分词工具使用的是IK的分词器,截图如下:
在上图中,散仙使用2个字段存储一样的内容,一个是分过词的,一个没分过词的,下面给出使用正则查询的核心代码:
1
2
3
4
5
6
7
8
9
10
11
|
RegexpQueryquery=
new
RegexpQuery(
Term(field,
".*"
+searchStr+
));
//System.out.println(query.toString());
TopDocss=search.search(query,
null
,
100
);
//TopDocss=search.search(bool,null,100);
System.out.println(s.totalHits);
Documentdocs=search.doc(ss.doc);
System.out.println(
"id=>"
+docs.get(
"id"
)+
"name==>"
"bookName"
"author==>"
"author"
));
//System.out.println(docs.get(field));
}
|
下面我们先来测,对不分词的字段的做模糊查询,测试的代码如下:
1
|
dao.testRegQuery(
"并发"
);
|
结果如下:
1
2
3
|