zoukankan      html  css  js  c++  java
  • 【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)根据搜索关键字,使用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)根据搜索关键字,使用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




  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/jediael/p/4304122.html
Copyright © 2011-2022 走看看