• 【Lucene4.8教程之三】搜索



    1、关键类

    Lucene的搜索过程中涉及的主要类有下面几个:

    (1)IndexSearcher:运行search()方法的类

    (2)IndexReader:对索引文件进行读操作,并为IndexSearcher提供搜索接口

    (3)Query及其子类:查询对象,search()方法的重要參数

    (4)QueryParser:依据用户输入的搜索词汇生成Query对象。

    (5)TopDocs:search()方法返回的前n个文档

    (6)ScoreDocs:提供TopDocs中搜索结果的訪问接口


    2、搜索的关键步骤

    (1)创建IndexReader

    (2)使用IndexReader创建IndexSearcher

    (3)依据搜索keyword,使用QueryParser生成Query对象

    (4)以Query作为參数调用IndexSearcher.search(),运行搜索

    (5)以TopDocs以及ScoreDocs遍历结果并处理

    演示样例代码例如以下:

    //(1)创建IndexReader
    Directory indexDir2 = FSDirectory.open(indexDir);
    IndexReader ir = DirectoryReader.open(indexDir2);
    //(2)使用IndexReader创建IndexSearcher
    IndexSearcher searcher = new IndexSearcher(ir);
    //(3)依据搜索keyword,使用QueryParser生成Query对象
    QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",new SimpleAnalyzer(Version.LUCENE_48));
    Query query = null;
    try {
    	query = parser.parse(term);
    	} catch (ParseException e) {
    		e.printStackTrace();
    	}
    //(4)以Query作为參数调用IndexSearcher.search(),运行搜索
    TopDocs docs = searcher.search(query, 30);		
    
    //(5)以TopDocs以及ScoreDocs遍历结果并处理
    ScoreDoc[] hits = docs.scoreDocs;
    System.out.println(hits.length);
    for (ScoreDoc hit : hits) {
    			System.out.println("doc: " + hit.doc + " score: " + hit.score);
    		}

    3、关于IndexReader

    (1)IndexReader未提供构造函数,因此须要通过DirectoryReader.open()方法来创建一个IndexReader。

    (2)创建一个IndexReader须要较大的系统开销,因此最好在全部搜索期间都反复使用一个IndexReader,仅仅有在必要的时候才建议打开新的IndexReader。

    (3)在创建IndexReader时,它会搜索已有的索引快照,假设你须要搜索索引中的变更信息,那么必须打开一个新的reader。所幸的是IndexReader.reopen方法是一个获取新IndexReader的有效方法,能在耗费较少系统资源的情况下使用当前reader来获取索引中全部的变更信息。【新版本号中已废弃,待确认替代方法】


    4、关于QueryParser与Query的子类

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

    searcher.search(query, 10);
    此时,其最重要的參数为一个Qeury对象。构造一个Query对象有2种方法:【均以在contents域搜索java关键词为例】

    (1)使用Query的子类,如BooleanQuery, ConstantScoreQuery, DisjunctionMaxQuery, FilteredQuery, MatchAllDocsQuery, MultiPhraseQuery, MultiTermQuery, PhraseQuery, SpanQuery, TermQuery,直接实例化一个对外:

    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的搜索域?

    关于QueryParser与Query子类的更具体内容,请參见

    【Lucene4.8教程之六】QueryParser与Query子类:怎样生成Query对象 http://blog.csdn.net/jediael_lu/article/details/33288793




  • 相关阅读:
    【机器学习】浅谈协方差
    python {}.format
    【机器学习】准确率、精确率、召回率
    【声纹识别】 EER
    【机器学习】 最形象的入门
    逻辑卷-LVM
    RAID及软RAID的实现
    输入数字or 字符串,统计重复次数---字典统计练习
    Python-数据结构之dict(字典*****)
    POJ 3204 网络流的必须边
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3898950.html
Copyright © 2020-2023  润新知