首页 | 网站地图 | RSS订阅 | 高级搜索 | 收藏本站
默认搜索       热门关键字: lucene  nutch  eee  lucene索引维护  lucene+in+action
Google广告位置
Google AD
当前位置:搜索引擎>Lucene> 正文

  • lucene 查询字符串的解析—QueryParser类
  • 日期:2007-12-13   点击:   作者:   来源:   字体:[ ]

11.4.4  使用前缀搜索—PrefixQuery

PrefixQuery就是使用前缀来进行查找的。通常情况下,首先定义一个词条Term。该词条包含要查找的字段名以及关键字的前缀,然后通过该词条构造一个PrefixQuery对象,就可以进行前缀查找了。

下面以代码11.7为例来介绍使用PrefixQuery进行检索的运行过程。

代码11.7  PrefixQueryTest.java

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.PrefixQuery;

import org.apache.lucene.search.RangeQuery;

 

public class PrefixQueryTest {

     public static void main(String[] args) throws Exception {

         //生成Document对象,下同

         Document doc1 = new Document();

         //添加“name”字段的内容,下同

         doc1.add(Field.Text("name", "David"));

         //添加“title”字段的内容,下同

         doc1.add(Field.Keyword("title", "doc1"));

 

         Document doc2 = new Document();

         doc2.add(Field.Text("name", "Darwen"));

         doc2.add(Field.Keyword("title", "doc2"));

 

         Document doc3 = new Document();

         doc3.add(Field.Text("name", "Smith"));

         doc3.add(Field.Keyword("title", "doc3"));

 

         Document doc4 = new Document();

         doc4.add(Field.Text("name", "Smart"));

         doc4.add(Field.Keyword("title", "doc4"));

 

         //生成索引书写器

         IndexWriter writer = new IndexWriter("c:\\index",

                 new StandardAnalyzer(), true);

         //设置为混合索引模式

         writer.setUseCompoundFile(true);

         //依次将文档添加到索引中

         writer.addDocument(doc1);

         writer.addDocument(doc2);

         writer.addDocument(doc3);

         writer.addDocument(doc4);

         //关闭索引书写器

         writer.close();

 

         //生成索引搜索器对象

         IndexSearcher searcher = new IndexSearcher("c:\\index");

         //构造词条

         Term pre1 = new Term("name", "Da");

         Term pre2 = new Term("name", "da");

         Term pre3 = new Term("name", "sm");

 

         //用于保存检索结果

         Hits hits = null;

         //生成PrefixQuery类型的对象,初始化为null

         PrefixQuery query = null;

 

         query = new PrefixQuery(pre1);

 

         //开始第一次检索,并返回检索结果

         hits = searcher.search(query);

         //输出相应的检索结果

         printResult(hits, "前缀为'Da'的文档");

        

         query = new PrefixQuery(pre2);

         //开始第二次检索,并返回检索结果

         hits = searcher.search(query);

         //输出相应的检索结果

         printResult(hits, "前缀为'da'的文档");

        

         query = new PrefixQuery(pre3);

         //开始第二次检索,并返回检索结果

         hits = searcher.search(query);

         //输出相应的检索结果

         printResult(hits, "前缀为'sm'的文档");

 

     }

 

     public static void printResult(Hits hits, String key) throws Exception

         {System.out.println("查找 \"" + key + "\" :");

         if (hits != null) {

             if (hits.length() == 0) {

                 System.out.println("没有找到任何结果");

                 System.out.println();

             } else {

                 System.out.print("找到");

                 for (int i = 0; i < hits.length(); i++) {

                     //取得文档

                     Document d = hits.doc(i);

                     //取得“title”字段的内容

                     String dname = d.get("title");

                     System.out.print(dname + "   ");

                 }

                 System.out.println();

                 System.out.println();

             }

         }

     }

}

在上述代码中,首先构造了4个不同的Document。每个Document都有一个名为“name”的字段,其中存储了人物的名称。然后,代码构建了3个不同的词条,分别为“Da”、“da”和“sm”,可以看到,它们正好都是“name”字段中关键字的前缀。

代码的运行结果如图11-12所示。

文本框:图11-12  PrefixQuery测试结果从图11-12中可以看出,使用PrefixQuery共进行了3次检索,关键字分别为“Da”、“da”和“sm”,返回的检索结果情况在图中已经有明确的说明。不过,如果使用“Da”作为关键字会没有任何的检索结果,而使用“da”就有检索结果,这个问题将在后面作详细介绍。

从代码11.7和图11-12中可以看出,“da”前缀和“sm”前缀都顺利地找到了它们所在的文档,可是为什么与文档中关键字大小写一致的“Da”却没有找到呢?这是因为Lucene的标准分析器在进行分词过滤时将所有的关键字一律转成了小写,所以才会出现这样的结果。这也是开发者应当引起注意的地方。


共7页: 上一页 [1] [2] [3] 4 [5] [6] [7] 下一页

所有评论 关闭窗口↓ 打印本页 论坛讨论 返回列表
用户名: 新注册) 密码: 匿名评论 [所有评论]

评论内容:(不能超过250字,请自觉遵守互联网相关政策法规。

最新评论: