一、简单的搜索程序
- 主要搜索的类:1) IndexSearcher 搜索操作入口,所有的搜索操作都是通过IndexSearcher实例使用一个重载的search方法来实现。 2)Query及其子类 具体的Query子类为每一种特定类型的查询进行了逻辑上的封装。Query实例被传递到IndexSearch的search方法中 3) QueryParser 将用户输入的(并且可读的)查询表达式处理为一个具体的Query对象 4) Hits 提供对搜索结果的访问。Hits对象由search方法返回
- 使用QueryParser解析查询表达式: 1)QueryParser是程序的搜索部分中唯一需要使用分析器的类。 2)如果解析不成功会抛出ParseException,程序应该能有效处理。
- 使用IndexSearcher 1)推荐通过Directory对象构造IndexSearcher实例 2)FsDirectory.getDirectory(indexDir, false) 的最后一个参数false表示我们希望打开的是一个已经存在的索引而非构造一个新的索引。 3)注意:IndexSearcher实例只搜索在他被实例化时已存在的索引。如果制作索引和搜索并发进行,那么最新你索引的文档对搜索来说是不可见的。
- 建议不要调用Hits类的doc(n)、id(n)和score(n)方法。因为这些方法需要在文档还没有被放入缓存之前就将器从索引中读取出来。
二、Lucene评分机制
- Explanation对象的内部包含了所有关于评分计算中各个因子的细节信息。
三、Query对象
- QueryParser类中的静态方法parse(String query, String field, Analyzer analyzer)内部运作:该静态方法在函数内部传建了一个QueryParser实例,并调用了该实例的parse(String query)方法。
- TempQuery
1)注意:查询项的值是区分大小写的。此外,由于不同的分词器的索引方式都不同,所以对原文的搜索可能还有其它问题。 2)TempQuery类在根据关键字(即通过Field.Keyword()索引过的关键字)查询文档时显得特别有用。 3)如果单个单词作为查询表达式,QueryParse的parse()函数将返回一个TermQuery对象。这个单词就相当于一个单独的项。public void testTerm() throws Exception { IndexSearcher searcher = new IndexSearcher(directory); Term t = new Term("subject", "ant"); //"subject"是域名,"ant"是查询项的值 Query query = new TermQuery(t); Hits hits = searcher.search(query); assertEquals("JDwA", 1, hits.length()); t = new Term("subject", "junit"); hits = searcher.search(new TermQuery(t)); assertEquals(2, hits.length()); searcher.close(); }
- RangeQuery
QueryParser可用[起始 To 终止]或{起始 To 终止}表达式来构造。前者边界包含在搜索范围,后者反之。RangeQuery query = new RangeQuery(begin, end, true); //begin、end均为项Term //true 指明搜索边界包含在搜索范围之内,反之为false IndexSearcher searcher = new IndexSearcher(directory);
- PrefixQuery
- BooleanQuery
- PhraseQuery
- WildcardQuery
- FuzzyQuery
四、解析查询表达式 QueryParser