用户在搜索引擎中进行搜索时,常常查找的并非是一个简单的单词,很有可能是几个不同的关键字。这些关键字之间要么是紧密相联,成为一个精确的短 语,要么是可能在这几个关键字之间还插有其他无关的关键字。此时,用户希望将它们找出来。不过很显然,从评分的角度看,这些关键字之间拥有与查找内容无关 短语所在的文档的分值一般会较低一些。

PhraseQuery正是Lucene所提供的满足上述需求的一种Query对象。它的add方法可以让用户往其内部添加关键字,在添加完毕后,用户还可以通过setSlop()方法来设定一个称之为“坡度”的变量来确定关键字之间是否允许、允许多少个无关词汇的存在。

  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.PhraseQuery;
  18.  
  19. import org.apache.lucene.search.PrefixQuery;
  20.  
  21. public class PhraseQueryTest {
  22.  
  23. public static void main(String[] args) throws Exception {
  24.  
  25. //生成Document对象
  26.  
  27. Document doc1 = new Document();
  28.  
  29. //添加“content”字段的内容
  30.  
  31. doc1.add(Field.Text("content", "david mary smith robert"));
  32.  
  33. //添加“title”字段的内容
  34.  
  35. doc1.add(Field.Keyword("title", "doc1"));
  36.  
  37. //生成索引书写器
  38.  
  39. IndexWriter writer = new IndexWriter("c://index",
  40.  
  41. new StandardAnalyzer(), true);
  42.  
  43. //设置为混合索引格式
  44.  
  45. writer.setUseCompoundFile(true);
  46.  
  47. //将文档添加到索引中
  48.  
  49. writer.addDocument(doc1);
  50.  
  51. //关闭索引
  52.  
  53. writer.close();
  54.  
  55. //生成索引搜索器
  56.  
  57. IndexSearcher searcher = new IndexSearcher("c://index");
  58.  
  59. //构造词条
  60.  
  61. Term word1 = new Term("content", "david");
  62.  
  63. Term word2 = new Term("content","mary");
  64.  
  65. Term word3 = new Term("content","smith");
  66.  
  67. Term word4 = new Term("content","robert");
  68.  
  69. //用于保存检索结果
  70.  
  71. Hits hits = null;
  72.  
  73. //生成PhraseQuery对象,初始化为null
  74.  
  75. PhraseQuery query = null;
  76.  
  77. // 第一种情况,两个词本身紧密相连,先设置坡度为0,再设置坡度为2
  78.  
  79. query = new PhraseQuery();
  80.  
  81. query.add(word1);
  82.  
  83. query.add(word2);
  84.  
  85. //设置坡度
  86.  
  87. query.setSlop(0);
  88.  
  89. //开始检索,并返回检索结果
  90.  
  91. hits = searcher.search(query);
  92.  
  93. //输出检索结果的相关信息
  94.  
  95. printResult(hits, "'david'与'mary'紧紧相隔的Document");
  96.  
  97. //再次设置坡度
  98.  
  99. query.setSlop(2);
  100.  
  101. //开始第二次检索
  102.  
  103. hits = searcher.search(query);
  104.  
  105. //输出检索结果
  106.  
  107. printResult(hits, "'david'与'mary'中相隔两个词的短语");
  108.  
  109. // 第二种情况,两个词本身相隔两个词,先设置坡度为0,再设置坡度为2
  110.  
  111. query = new PhraseQuery();
  112.  
  113. query.add(word1);
  114.  
  115. query.add(word4);
  116.  
  117. //设置坡度
  118.  
  119. query.setSlop(0);
  120.  
  121. //开始第三次检索,并返回检索结果
  122.  
  123. hits = searcher.search(query);
  124.  
  125. //输出检索结果
  126.  
  127. printResult(hits, "'david'与'robert'紧紧相隔的Document");
  128.  
  129. //设置坡度
  130.  
  131. query.setSlop(2);
  132.  
  133. //开始第四次检索,并返回检索结果
  134.  
  135. hits = searcher.search(query);
  136.  
  137. //输出检索结果
  138.  
  139. printResult(hits, "'david'与'robert'中相隔两个词的短语");
  140.  
  141. }
  142.  
  143. public static void printResult(Hits hits, String key) throws Exception
  144.  
  145. {System.out.println("查找 /"" + key + "/" :");
  146.  
  147. if (hits != null) {
  148.  
  149. if (hits.length() == 0) {
  150.  
  151. System.out.println("没有找到任何结果");
  152.  
  153. System.out.println();
  154.  
  155. } else {
  156.  
  157. System.out.print("找到");
  158.  
  159. for (int i = 0; i < hits.length(); i++) {
  160.  
  161. //取得文档对象
  162.  
  163. Document d = hits.doc(i);
  164.  
  165. //取得“title”字段的内容
  166.  
  167. String dname = d.get("title");
  168.  
  169. //输出相关的信息
  170.  
  171. System.out.print(dname + " ");
  172.  
  173. }
  174.  
  175. System.out.println();
  176.  
  177. System.out.println();
  178.  
  179. }
  180.  
  181. }
  182.  
  183. }
  184.  
  185. }

在上述代码中创建了一个Document,这个Document的“content”域中含有4个关键字。接下来,代码创建了一个PhraseQuery对象,首先将前两个紧紧相连关键字放入其中,并设置它们的坡度值分别为0和2,接下来,又将第一个和最后一个关键字放入其中,同样设置它们的坡度值为0和2。

lucene-查询query->PhraseQuery多关键字的搜索的更多相关文章

  1. Lucene 查询(Query)子类

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

  2. 【转载】Lucene.Net无障碍学习和使用:搜索篇

    在上一篇中,我们初步理解了索引的增删改查基本操作.本文着重介绍一下常用的搜索,以及搜索结果的排序和分页.本文的搜索主要是基于前一篇介绍的文本文件的索引,建议下载最后改进的demo对照着看阅读本文,同时 ...

  3. lucene 查询 (转载)

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

  4. Lucene.Net无障碍学习和使用:搜索篇

    一.初步认识搜索 先从上一篇示例代码中我们摘录一段代码看看搜索的简单实现: private TopDocs Search(string keyword,string field) { TopDocs ...

  5. 使用Lucene.NET实现简单的站内搜索

    使用Lucene.NET实现简单的站内搜索 导入Lucene.NET 开发包 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和 ...

  6. 用Lucene.net对数据库建立索引及搜索<转>

    用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个 ...

  7. lucene查询解析器语法

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

  8. Lucene查询语法详解

    Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...

  9. Lucene查询索引(分页)

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

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

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

随机推荐

  1. session和cookie的区别和联系

    使用session会在客户端生成一个文件,这个文件是以session_id来命名,用来保存文件:生成的文件保存在这个路径中:session.save_path = "D:/wampstack ...

  2. JProfiler

    1  前言 回答之前先让我们来看看什么是jProfiler:JProfiler是一个商业授权的Java剖析工具,由EJ技术有限公司,针对Java EE和Java SE应用程序开发的.它允许两个内存剖面 ...

  3. 转载 Appstore 上传被拒原因及解释

    原 apps被拒绝的各种理由以及翻译 1. Terms and conditions(法律与条款) 2. Functionality(功能) 3. Metadata (name, descriptio ...

  4. gedit脚本

    明天ctsc,赶紧学了一下gedit的配置 以下假设你只在/home/zzq下写代码(用户名自己改) 首先在/home/zzq下建一个runner.sh,内容如下: #!/bin/bash echo ...

  5. sublime自定义快键键不行,

    其实sublime自身就有格式化命令,就不再安装插件,位置在[Edit]->[Line]->[Reindent]但这个默认的命令没有快捷键,就重新定义了一下,想用习惯了的eclipse快捷 ...

  6. php加载xml编码错误,“Error: Input is not proper UTF-8, indicate encoding! ”

    最近在给php中解析xml的时候,抛出一个错误: "Warning: DOMDocument::load(): Input is not proper UTF-8, indicate enc ...

  7. HTTP 错误 500.22 - Internal Server Error

    HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 最可能的原因: 此应用程序在 system.web/http ...

  8. C#并行编程中的Parallel.Invoke

    一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过程中一般会将很多任务划分成若干个互相独立子任务, ...

  9. 实验一 Java开发环境的熟悉

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没 ...

  10. Entity Framework 出现 "此 ObjectContext 实例已释放,不可再用于需要连接的操作" 的错误

    原因 Entity的导航属性在View中使用,但是该Entity所在的Context已经在Controller中通过 using 释放掉:但是Entity又具有Deferred Query Evalu ...