Java基础、中级、高级、架构面试资料

Lucene 实战教程第十三章禁用模糊查询 FuzzyQuery 和通配符查询 WildcardQuery

JAVA herman 3494浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

在某些需求场景下,我们可能需要禁用模糊查询 FuzzyQuery 和通配符查询 WildcardQuery,那通过 QueryParser 该怎么做呢?

答案就是重写 QueryParser 类。实现自己的 QueryParser 类,并将 getFuzzyQuery 方法和 getWildcardQuery 方法重写,抛出禁用的异常即可。

前面我们说过 FuzzyQuery 类可以实现搜索类似项的需求,WildcardQuery 类支持通配符查询。

@Test
public void testFuzzyQuery() throws IOException, ParseException {
    //注意是区分大小写的,同时默认的编辑距离的值是2
    //注意两个Term之间的编辑距离必须小于两者中最小者的长度:the edit distance between the terms must be less than the minimum length term
    Query query = new FuzzyQuery(new Term("city", "Veni"));
    IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(directory));
    TopDocs search = indexSearcher.search(query, 10);
    Assert.assertEquals(1, search.totalHits);
}
@Test
public void testWildcardQuery() throws IOException {
    //*代表0个或者多个字母
    Query query = new WildcardQuery(new Term("content", "*dam"));
    IndexSearcher indexSearcher = new IndexSearcher(DirectoryReader.open(directory));
    TopDocs search = indexSearcher.search(query, 10);
    Assert.assertEquals(1, search.totalHits);
    //?代表0个或者1个字母
    query = new WildcardQuery(new Term("content", "?ridges"));
    search = indexSearcher.search(query, 10);
    Assert.assertEquals(2, search.totalHits);
    query = new WildcardQuery(new Term("content", "b*s"));
    search = indexSearcher.search(query, 10);
    Assert.assertEquals(2, search.totalHits);
}

如果我现在要禁用它们,那么只需要按照下面的方法重写 getWildcardQuery 和 getFuzzyQuery 方法即可。

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.Query;
/**
 * Description:禁用模糊查询和通配符查询,同样的如果希望禁用其它类型查询,只需要覆写对应的getXXXQuery方法即可
 */
public class CustomQueryParser extends QueryParser {
    public CustomQueryParser(String f, Analyzer a) {
        super(f, a);
    }
    @Override
    protected Query getFuzzyQuery(String field, String termStr, float minSimilarity) throws ParseException {
        throw new ParseException("Fuzzy queries not allowed!");
    }
    @Override
    protected Query getWildcardQuery(String field, String termStr) throws ParseException {
        throw new ParseException("Wildcard queries not allowed!");
    }
    public static void main(String args[]) throws ParseException {
        CustomQueryParser customQueryParser = new CustomQueryParser("filed", new WhitespaceAnalyzer());
        customQueryParser.parse("a?t");
        customQueryParser.parse("junit~");
    }
}

这样就可以达到禁用模糊查询和通配符查询的功能了。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » Lucene 实战教程第十三章禁用模糊查询 FuzzyQuery 和通配符查询 WildcardQuery