• 【Lucene4.8教程之六】QueryParser与Query子类:怎样生成Query对象


    版权声明:本文为博主原创文章。转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/details/33288793


    一、概述

    1、对于一个搜索而言,其核心语句为:

    searcher.search(query, 10);
    此时,其最重要的參数为一个Qeury对象。构造一个Query对象有2种方法:

    (1)使用Query的子类创建一个对象。

    (2)使用QueryParser.parse()创建一个对象。

    经常使用的用于实例化一个对象的Query子类有下面13个:
    TermQuery
    BooleanQuery
    WildcardQuery
    PhraseQuery
    PrefixQuery
    MultiPhraseQuery
    FuzzyQuery
    RegexpQuery
    TermRangeQuery
    NumericRangeQuery
    ConstantScoreQuery
    DisjunctionMaxQuery
    MatchAllDocsQuery

    2、高速入门

    【均以在contents域搜索java关键词为例】

    (1)使用Query的子类。。直接实例化一个对外:

    searcher.search( new TermQuery(new Term("contents","java")), 10);

    下面语句结构更为清晰

    Term term= new Term("contents","java");
    TermQuery tq = new TermQuery(term);
    searcher.search(tq , 10);

    此外。即为在contents域中搜索包含java的文档。

    (2)使用QueryParser的parse()方法,对所传入的搜索关键词汇进行解释,并返回query对象。

    QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",new SimpleAnalyzer(Version.LUCENE_48));
    Query query = null;
    try {
    	query = parser.parse("java");
    } catch (ParseException e) {
    	e.printStackTrace();
    }
    TopDocs docs = searcher.search(query, 10);
    以上语句创建一个QueryParser,其默认搜索域为contents,然后将搜索词汇转化为Query对象。

    假设指定QueryParser的默认搜索域为所有?怎样指定一个Query的搜索域?


    二、TermQuery

    1、创建方式

    上述高速入门中使用的就是TermQuery。

    2、适用范围

    (1)直接使用TermQuery,不正确搜索词作不论什么的分析,包含大写和小写都不作转换,而使用QueryParser,则能够依据Analyzer的类型作分析。

    (2)TermQuery适合使用于全然匹配的搜索,如搜索id号。二维码。姓名等。


    三、BooleanQuery

    1、创建方式

    (1)使用BooleanQuery

    多个搜索条件组成BooleanQuey对象。以后补充样例。

    (2)使用QueryParser

    对于一个QueryParser,若其未指定是何种逻辑操作,则其将默觉得Operator.OR。因此,若搜索 java web,则其会觉得java OR web。

    而对于中文,使用StandartAnalyzer分析器时,会将每一个字作为一个词汇。如搜索“学习”,则搜索“学 OR 习”。

    因此,为指定搜索“学习”或者'java web"等,必须显示指定逻辑操作为Operator.AND。

    QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",
    				new StandardAnalyzer(Version.LUCENE_48));
    parser.setDefaultOperator(Operator.AND);
    Query query  = parser.parse(term);

    2、适用范围

    (1)BooleanQuery方式。因为须要将搜索内容生成多个Query对象,再进行逻辑组合。因此,仅仅适用于依据多个搜索条件进行搜索的情形。

    如:

       

    在上述页面选择多个筛选条件,然后。每一个筛选条件生成一个Query对象,再将各个Query对象进行逻辑组合。

    (2)QueryParser方式。适用于单一搜索框,使用自然语言进行搜索的情形。如google,百度等搜索框。


    四、PhraseQuery

    1、简单说明

    在使用双引號将搜索keyword括起来,则将搜索关键词作为一个总体的短语进行搜索。如:




    前者仅仅有534个返回结果,后者有200多万返回结果。对于前者,将会搜索java 和sunshine之间的距离少于一个特定的slop值的文档。







  • 相关阅读:
    Java基础——clone()方法浅析
    Unity shader error: “Too many texture interpolators would be used for ForwardBase pass”
    ar 解压一个.a文件报错: xxx.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
    How to set up "lldb_codesign" certificate!
    Unity-iPhone has Conflicting Provisioning Settings
    ETC1/DXT1 compressed textures are not supported when publishing to iPhone
    Xcode 提交APP时遇到 “has one iOS Distribution certificate but its private key is not installed”
    XCode iOS之应用程序标题本地化
    苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置
    Unity 4.7 导出工程在XCode10.1上编译报错
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10723500.html
Copyright © 2020-2023  润新知