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

  1. package ch11;
  2.  
  3. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  4.  
  5. import org.apache.lucene.document.Document;
  6.  
  7. import org.apache.lucene.document.Field;
  8.  
  9. import org.apache.lucene.index.IndexWriter;
  10.  
  11. import org.apache.lucene.index.Term;
  12.  
  13. import org.apache.lucene.search.Hits;
  14.  
  15. import org.apache.lucene.search.IndexSearcher;
  16.  
  17. import org.apache.lucene.search.PrefixQuery;
  18.  
  19. import org.apache.lucene.search.RangeQuery;
  20.  
  21. public class PrefixQueryTest {
  22.  
  23. public static void main(String[] args) throws Exception {
  24.  
  25. //生成Document对象,下同
  26.  
  27. Document doc1 = new Document();
  28.  
  29. //添加“name”字段的内容,下同
  30.  
  31. doc1.add(Field.Text("name", "David"));
  32.  
  33. //添加“title”字段的内容,下同
  34.  
  35. doc1.add(Field.Keyword("title", "doc1"));
  36.  
  37. Document doc2 = new Document();
  38.  
  39. doc2.add(Field.Text("name", "Darwen"));
  40.  
  41. doc2.add(Field.Keyword("title", "doc2"));
  42.  
  43. Document doc3 = new Document();
  44.  
  45. doc3.add(Field.Text("name", "Smith"));
  46.  
  47. doc3.add(Field.Keyword("title", "doc3"));
  48.  
  49. Document doc4 = new Document();
  50.  
  51. doc4.add(Field.Text("name", "Smart"));
  52.  
  53. doc4.add(Field.Keyword("title", "doc4"));
  54.  
  55. //生成索引书写器
  56.  
  57. IndexWriter writer = new IndexWriter("c://index",
  58.  
  59. new StandardAnalyzer(), true);
  60.  
  61. //设置为混合索引模式
  62.  
  63. writer.setUseCompoundFile(true);
  64.  
  65. //依次将文档添加到索引中
  66.  
  67. writer.addDocument(doc1);
  68.  
  69. writer.addDocument(doc2);
  70.  
  71. writer.addDocument(doc3);
  72.  
  73. writer.addDocument(doc4);
  74.  
  75. //关闭索引书写器
  76.  
  77. writer.close();
  78.  
  79. //生成索引搜索器对象
  80.  
  81. IndexSearcher searcher = new IndexSearcher("c://index");
  82.  
  83. //构造词条
  84.  
  85. Term pre1 = new Term("name", "Da");
  86.  
  87. Term pre2 = new Term("name", "da");
  88.  
  89. Term pre3 = new Term("name", "sm");
  90.  
  91. //用于保存检索结果
  92.  
  93. Hits hits = null;
  94.  
  95. //生成PrefixQuery类型的对象,初始化为null
  96.  
  97. PrefixQuery query = null;
  98.  
  99. query = new PrefixQuery(pre1);
  100.  
  101. //开始第一次检索,并返回检索结果
  102.  
  103. hits = searcher.search(query);
  104.  
  105. //输出相应的检索结果
  106.  
  107. printResult(hits, "前缀为'Da'的文档");
  108.  
  109. query = new PrefixQuery(pre2);
  110.  
  111. //开始第二次检索,并返回检索结果
  112.  
  113. hits = searcher.search(query);
  114.  
  115. //输出相应的检索结果
  116.  
  117. printResult(hits, "前缀为'da'的文档");
  118.  
  119. query = new PrefixQuery(pre3);
  120.  
  121. //开始第二次检索,并返回检索结果
  122.  
  123. hits = searcher.search(query);
  124.  
  125. //输出相应的检索结果
  126.  
  127. printResult(hits, "前缀为'sm'的文档");
  128.  
  129. }
  130.  
  131. public static void printResult(Hits hits, String key) throws Exception
  132.  
  133. {System.out.println("查找 /"" + key + "/" :");
  134.  
  135. if (hits != null) {
  136.  
  137. if (hits.length() == 0) {
  138.  
  139. System.out.println("没有找到任何结果");
  140.  
  141. System.out.println();
  142.  
  143. } else {
  144.  
  145. System.out.print("找到");
  146.  
  147. for (int i = 0; i < hits.length(); i++) {
  148.  
  149. //取得文档
  150.  
  151. Document d = hits.doc(i);
  152.  
  153. //取得“title”字段的内容
  154.  
  155. String dname = d.get("title");
  156.  
  157. System.out.print(dname + " ");
  158.  
  159. }
  160.  
  161. System.out.println();
  162.  
  163. System.out.println();
  164.  
  165. }
  166.  
  167. }
  168.  
  169. }
  170.  
  171. }

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

lucene-查询query->PrefixQuery使用前缀搜索的更多相关文章

  1. Lucene 查询(Query)子类

    QueryParser(单域查询) QueryParser子类对单个域查询时创建查询query,构造方法中需要传入Lucene版本号,检索域名和分词器. QueryParser parser = ne ...

  2. lucene 查询 (转载)

    原网址:http://hi.baidu.com/lszhuhaichao/blog/item/ccffc7cb858f1514bf09e66f.html Lucene3.0之查询处理(1):原理201 ...

  3. lucene查询索引库、分页、过滤、排序、高亮

    2.查询索引库 插入测试数据 xx.xx. index. ArticleIndex @Test public void testCreateIndexBatch() throws Exception{ ...

  4. query_string查询支持全部的Apache Lucene查询语法 低频词划分依据 模糊查询 Disjunction Max

    3.3 基本查询3.3.1词条查询 词条查询是未经分析的,要跟索引文档中的词条完全匹配注意:在输入数据中,title字段含有Crime and Punishment,但我们使用小写开头的crime来搜 ...

  5. lucene查询解析器语法

    注意:使用QueryParser查询,关键词是会被分词的,如果不需要分词,可以选择使用Lucene提供的API查询类. Lucene提供了丰富的API来组合定制你所需要的查询器,同时也可以利用Quer ...

  6. 基于Lucene查询原理分析Elasticsearch的性能

    前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...

  7. Lucene 查询原理 传统二级索引方案 倒排链合并 倒排索引 跳表 位图

    提问: 1.倒排索引与传统数据库的索引相比优势? 2.在lucene中如果想做范围查找,根据上面的FST模型可以看出来,需要遍历FST找到包含这个range的一个点然后进入对应的倒排链,然后进行求并集 ...

  8. Lucene查询索引(分页)

    分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...

  9. 第六步:Lucene查询索引(优化一)

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  10. lucene 查询的使用

    各种查询方式一:使用QueryParser与查询语法.(会使用分词器) MultiFieldQueryParser查询字符串 ------------------------> Query对象 ...

随机推荐

  1. python 使用pip安装第三方模块

    part 1:使用方法: 1.pip install somePackage picture 1 2.pip show somePackage 例如:pip show pip 弹出关于该模块的信息 p ...

  2. 一些重要的mel命令

    一些重要的mel命令 查询多边形顶点 xform -q -worldSpace -t "pCylinderShape1.vtx[0]" 设置顶点坐标 xform -objectSp ...

  3. javascript中String的fromCharCode()方法

    前几天遇到一个bug,后端的模板引擎在输出形如: <div title="111 aaa">内容</div> 这样的内容时,无法输出' '空格,所以只能用' ...

  4. removeNode is not defined removeNode is not a function

    在javascript操作dom树的时候可能会经常遇到增加,删除节点的事情,比如一个输入框后一个增加按钮,一个删除按钮,点击增加就增加 个输入框,点击删除就删除对应的输入框.在一些js框架,如Prot ...

  5. Windows 8.1 新增控件之 Flyout

    本篇为大家介绍Flyout 控件,Flyout 属于一种轻量级交互控件,可以支持信息提示或用户交互.与传统Dialog 控件不同的是Flyout 控件可通过直接点击对话框外部区域忽略. Flyout ...

  6. Lowest Common Ancestor of a Binary Search Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  7. TinyFrame升级之一:框架概览

    由于之前的TinyFrame多于简单,并且只是说明原理,并无成型的框架出来,所以这次我把之前的知识进行了汇总,然后做出了这一版的TinyFrame框架. 整个框架的结构如下: TinyFrame.Da ...

  8. linux中vi编辑器的使用

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本 编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任 何版本,vi编辑器是完 ...

  9. 0 bug 读后感

    本书全名是 <0 bug- C/C++商用工程之道>,这是一本有争议的书,豆瓣链接: http://book.douban.com/subject/4149139/ ,建议有一些商用的开发 ...

  10. CUDA2.1-原理之索引与warp

    本小节来自<大规模并行处理器编程实战>第四节,该书是很好的从内部原理结构上来讲述了CUDA的,对于理解CUDA很有帮助,借以博客的形式去繁取间,肯定会加入自己个人理解,所以有错误之处还望指 ...