`

十九、自定义QueryParser

 
阅读更多

原因:
1、对于某些QueryParser(FuzzyQuery,WildcardQuery)在查询时会使得性能降低,所以考虑将这些查询取消
2、在具体的查询时,很有可能有这样一种需求:需要获取的是一个数字的范围查询。所以必须扩展原有的QueryParser才能进行查询

实现思路:覆盖QueryParser类,并且重载相应方法



public class CustomParser extends QueryParser {

    public CustomParser(Version matchVersion, String f, Analyzer a) {
        super(matchVersion, f, a);
    }
   
    @Override
    protected org.apache.lucene.search.Query getWildcardQuery(String field,
            String termStr) throws ParseException {
        throw new ParseException("由于性能原因,已经禁用了通配符查询,请输入更精确的信息进行查询");
    }
   
    @Override
    protected org.apache.lucene.search.Query getFuzzyQuery(String field,
            String termStr, float minSimilarity) throws ParseException {
        throw new ParseException("由于性能原因,已经禁用了模糊查询,请输入更精确的信息进行查询");
    }
   
    @Override
    protected org.apache.lucene.search.Query getRangeQuery(String field,
            String part1, String part2, boolean inclusive)
            throws ParseException {
       
        if(field.equals("size")) {
            return NumericRangeQuery.newIntRange(field,Integer.parseInt(part1), Integer.parseInt(part2), inclusive, inclusive);
        } else if(field.equals("date")) {
            String dateType = "yyyy-MM-dd";
            Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
            if(pattern.matcher(part1).matches()&&pattern.matcher(part2).matches()) {
                SimpleDateFormat sdf = new SimpleDateFormat(dateType);
                try {
                    long start = sdf.parse(part1).getTime();
                    long end = sdf.parse(part2).getTime();
                    return NumericRangeQuery.newLongRange(field, start, end, inclusive, inclusive);
                } catch (java.text.ParseException e) {
                    e.printStackTrace();
                }
            } else {
                throw new ParseException("要检索的日期格式不正确,请使用"+dateType+"这种格式");
            }
        }
       
        return super.newRangeQuery(field, part1, part2, inclusive);
    }
}



分享到:
评论

相关推荐

    PyPI 官网下载 | queryparser-python2-0.3.tar.gz

    在Python中,这种格式通常包含源代码,便于开发者查看、调试或自定义构建。 标签"Python库"揭示了`queryparser-python2-0.3`是一个专门为Python设计的软件库。Python库是提供特定功能的代码集合,可以被其他Python...

    solr-web-5.3.1:solr-web-5.3.1的项目原始码,包括自定义lucene的QueryParser及servlet

    在描述中提到,此项目实现了自定义的 `servlet` 和 `QueryParser`。Servlet 是 Java 用于构建 Web 应用程序的一种组件,它允许服务器处理客户端的请求。在这个 Solr 实例中,自定义的 servlet 可能是为了扩展 Solr ...

    依赖Lucene的电话号码查询优化

    例如,`MoblieQParserPlugin.java`可能就是一个实现了自定义QueryParser的类,用于处理电话号码查询。在自定义QueryParser时,我们可以考虑以下几点: 1. **分词策略**:电话号码不包含自然语言中的词汇,因此不...

    Lucene的正则表达式检索

    自定义QueryParser时,可以重写`parse`方法来处理包含正则表达式的查询字符串,然后将其转化为相应的Lucene Query对象。 2. **使用Analyzer和TokenStream** 在Lucene中,Analyzer负责将输入的文本分解为Token...

    Lucene2实战源码

    用户可以自定义QueryParser以支持复杂的查询语法,如布尔运算符、短语匹配等。 3.2 搜索执行 使用IndexSearcher执行Query,得到TopDocs结果集,其中包含了匹配度最高的文档及其分数。通过ScoreDoc可以获取具体文档...

    lucene源码分析1111

    自定义QueryParser可以处理复杂的查询需求。 5. **搜索过程** - 搜索器(Searcher)执行查询,它通过索引找到匹配的文档,并计算相关度得分。ScoreDoc类存储了每个匹配文档的相关度信息,TopDocs类则提供了排序后...

    全文搜索lucene知识

    此外,还可以自定义QueryParser扩展其功能,例如支持复杂的布尔逻辑和模糊匹配。 ### 4. 搜索执行 一旦索引建立,搜索就是通过Searcher类来执行的。Searcher接受Query对象,并返回匹配的Document列表。这个过程...

    Apache Lucene-4.10.3源码

    用户还可以自定义QueryParser实现复杂的查询逻辑。 4. **搜索执行**:使用Searcher类进行搜索操作,它基于索引找到最相关的结果。搜索过程涉及术语匹配、评分和排序。TF-IDF(Term Frequency-Inverse Document ...

    clucene中文处理

    这可能需要自定义QueryParser,使其能够正确地处理中文关键词,进行模糊匹配、同义词查找等高级查询功能。 在索引和搜索过程中,还要考虑中文的特殊性,比如词语的多音字、同形字、词义的多样性等。这可能需要引入...

    lucene高级搜索进阶项目_02

    通过自定义QueryParser或使用Analyzer,我们可以控制查询的解析方式,以满足特定的搜索需求。 二、复杂查询类型 除了基本的单词查询,Lucene还支持更复杂的查询类型,如PrefixQuery(前缀查询)、WildcardQuery...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-12.Lucene搜索深入实战进阶2 共9页.pptx

    【Lucene 搜索引擎深入实战】Lucene 是一个开源的全文搜索引擎库,广泛应用于各种...在实际项目中,可能还需要结合Lucene的高级特性,如排序、过滤、自定义分词器以及项目实战经验,以达到最佳的搜索性能和用户体验。

    Lucene 3.6 学习笔记

    #### 5.4 自定义QueryParser - 限制低效查询。 - 扩展对数字和日期的查询支持。 ### 第六章 Lucene 扩展 #### 6.1 Luke - Luke是Lucene的可视化工具,用于查看和分析索引。 - 可以查看索引结构、文档信息、查询等...

    lucene-4.7.0全套jar包

    - **QueryParser模块**:实现了查询解析功能,如`lucene-queryparser-4.7.0.jar`。 - **Memory模块**:提供了内存中的索引支持,适用于小型应用或测试,如`lucene-memory-4.7.0.jar`。 - **Miscellaneous模块**:...

    Lucene3.3.0学习Demo

    默认的StandardAnalyzer会处理英文文本,但可以自定义Analyzer来适应其他语言或特定需求。 2. **索引创建**:将分词后的关键词与原始文档的相关信息(如路径、标题等)一起构建索引。索引是高效的搜索基础,它将...

    lucene分词程序

    同样,在QueryParser中也要指定Analyzer,以确保在解析查询时使用自定义的分词逻辑。 6. **优化与调试** 对自定义分词程序的优化主要包括提高性能、减少内存占用和优化分词结果。可以通过调整分词规则、缓存策略...

    lucene(jar)

    此外,QueryParser还允许自定义语法,以适应不同类型的查询需求。 四、Lucene Highlighter `lucene-highlighter-5.5.4.jar` 是高亮显示模块,它在搜索结果中突出显示与查询相关的部分。在返回搜索结果时,高亮显示...

    基于LUCENE的搜索引擎的设计与实现源代码

    3. **查询相关的类**:可能有自定义的QueryParser或Query构造函数。 4. **搜索和结果展示类**:执行查询、获取和展示结果的代码。 通过阅读和理解这些源代码,可以深入了解Lucene的工作机制,并能根据实际需求对其...

    javacc lucene全文检索语言转换.jjt

    为了实现这个转换,开发者可能定义了一种类似于SQL的查询语言,或者是一种更简单的结构,比如布尔表达式,然后用JavaCC来解析这种语言,并生成对应的Lucene QueryParser可以处理的查询对象。这种方式允许用户以更...

    lucene6.6jar包

    此外,还提供了分词器接口,允许开发者自定义文本分析策略。 接下来是`lucene-analyzers-common-6.6.0.jar`。这个文件包含了 Lucene 提供的一系列常见分析器,用于对输入文本进行预处理,如分词、去除停用词、词形...

    lucene-4.6.1全套jar包

    4.6.1版本包含了多种预定义的分析器,如标准分析器、英文分析器等,同时允许自定义分析器以满足特定语言或业务需求。 **6. 文档与字段** 在Lucene中,信息以文档的形式存储,每个文档由一个或多个字段组成。4.6.1...

Global site tag (gtag.js) - Google Analytics