lucene-查询query->PhraseQuery多关键字的搜索
用户在搜索引擎中进行搜索时,常常查找的并非是一个简单的单词,很有可能是几个不同的关键字。这些关键字之间要么是紧密相联,成为一个精确的短 语,要么是可能在这几个关键字之间还插有其他无关的关键字。此时,用户希望将它们找出来。不过很显然,从评分的角度看,这些关键字之间拥有与查找内容无关 短语所在的文档的分值一般会较低一些。
PhraseQuery正是Lucene所提供的满足上述需求的一种Query对象。它的add方法可以让用户往其内部添加关键字,在添加完毕后,用户还可以通过setSlop()方法来设定一个称之为“坡度”的变量来确定关键字之间是否允许、允许多少个无关词汇的存在。
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.PhraseQuery;
import org.apache.lucene.search.PrefixQuery;
public class PhraseQueryTest {
public static void main(String[] args) throws Exception {
//生成Document对象
Document doc1 = new Document();
//添加“content”字段的内容
doc1.add(Field.Text("content", "david mary smith robert"));
//添加“title”字段的内容
doc1.add(Field.Keyword("title", "doc1"));
//生成索引书写器
IndexWriter writer = new IndexWriter("c://index",
new StandardAnalyzer(), true);
//设置为混合索引格式
writer.setUseCompoundFile(true);
//将文档添加到索引中
writer.addDocument(doc1);
//关闭索引
writer.close();
//生成索引搜索器
IndexSearcher searcher = new IndexSearcher("c://index");
//构造词条
Term word1 = new Term("content", "david");
Term word2 = new Term("content","mary");
Term word3 = new Term("content","smith");
Term word4 = new Term("content","robert");
//用于保存检索结果
Hits hits = null;
//生成PhraseQuery对象,初始化为null
PhraseQuery query = null;
// 第一种情况,两个词本身紧密相连,先设置坡度为0,再设置坡度为2
query = new PhraseQuery();
query.add(word1);
query.add(word2);
//设置坡度
query.setSlop(0);
//开始检索,并返回检索结果
hits = searcher.search(query);
//输出检索结果的相关信息
printResult(hits, "'david'与'mary'紧紧相隔的Document");
//再次设置坡度
query.setSlop(2);
//开始第二次检索
hits = searcher.search(query);
//输出检索结果
printResult(hits, "'david'与'mary'中相隔两个词的短语");
// 第二种情况,两个词本身相隔两个词,先设置坡度为0,再设置坡度为2
query = new PhraseQuery();
query.add(word1);
query.add(word4);
//设置坡度
query.setSlop(0);
//开始第三次检索,并返回检索结果
hits = searcher.search(query);
//输出检索结果
printResult(hits, "'david'与'robert'紧紧相隔的Document");
//设置坡度
query.setSlop(2);
//开始第四次检索,并返回检索结果
hits = searcher.search(query);
//输出检索结果
printResult(hits, "'david'与'robert'中相隔两个词的短语");
}
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();
}
}
}
}
在上述代码中创建了一个Document,这个Document的“content”域中含有4个关键字。接下来,代码创建了一个PhraseQuery对象,首先将前两个紧紧相连关键字放入其中,并设置它们的坡度值分别为0和2,接下来,又将第一个和最后一个关键字放入其中,同样设置它们的坡度值为0和2。
lucene-查询query->PhraseQuery多关键字的搜索的更多相关文章
- Lucene 查询(Query)子类
QueryParser(单域查询) QueryParser子类对单个域查询时创建查询query,构造方法中需要传入Lucene版本号,检索域名和分词器. QueryParser parser = ne ...
- 【转载】Lucene.Net无障碍学习和使用:搜索篇
在上一篇中,我们初步理解了索引的增删改查基本操作.本文着重介绍一下常用的搜索,以及搜索结果的排序和分页.本文的搜索主要是基于前一篇介绍的文本文件的索引,建议下载最后改进的demo对照着看阅读本文,同时 ...
- lucene 查询 (转载)
原网址:http://hi.baidu.com/lszhuhaichao/blog/item/ccffc7cb858f1514bf09e66f.html Lucene3.0之查询处理(1):原理201 ...
- Lucene.Net无障碍学习和使用:搜索篇
一.初步认识搜索 先从上一篇示例代码中我们摘录一段代码看看搜索的简单实现: private TopDocs Search(string keyword,string field) { TopDocs ...
- 使用Lucene.NET实现简单的站内搜索
使用Lucene.NET实现简单的站内搜索 导入Lucene.NET 开发包 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和 ...
- 用Lucene.net对数据库建立索引及搜索<转>
用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个 ...
- lucene查询解析器语法
注意:使用QueryParser查询,关键词是会被分词的,如果不需要分词,可以选择使用Lucene提供的API查询类. Lucene提供了丰富的API来组合定制你所需要的查询器,同时也可以利用Quer ...
- Lucene查询语法详解
Lucene查询 Lucene查询语法以可读的方式书写,然后使用JavaCC进行词法转换,转换成机器可识别的查询. 下面着重介绍下Lucene支持的查询: Terms词语查询 词语搜索,支持 单词 和 ...
- Lucene查询索引(分页)
分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...
- 第六步:Lucene查询索引(优化一)
package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...
随机推荐
- Editor扩展之查看Prefab用在那儿
Prefab查找需求 在项目开发阶段的中后期,工程中有越来越多的Prefab,当我们要修改一个prefab或删除无用的prefab时,或许我们不是那么清楚该prefab在那些场景中使用着或从未使用过, ...
- reflect2015破解
具体看 http://download.congci.com/download/net-reflector-7-6-1-824-wanquan-pojie#downloads *博主注:因为很多破解程 ...
- vijos[1355]车队过桥问题
描述 现有N辆车要按顺序通过一个单向的小桥,由于小桥太窄,不能有两辆车并排通过.另外,由于小桥建造的时间已经很久,只能承受有限的重量,记为Max(吨).管理员将N辆车按初始的顺序分组,每次让一个组过桥 ...
- 【深入ASP.NET原理系列】--ASP.NET页面生命周期
前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...
- AFNetworking 基本使用
AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection, NSOperation和其他方法为基础的. 下面这个例子是用来处理json请求的 3如何选择AFNetwork ...
- windows下安装memcache的基本步骤
本文主要解决的是window下memcached的安装的问题,在使用的过程中经常会被第一步环境的配置搞混,本文结合我的配置过程和遇到的问题,做一个总结 1,开启php memcache的扩展,在文件 ...
- vs2015企业版太大了
安装教程 http://www.cnblogs.com/mephisto/archive/2015/07/22/4666032.html#!comments 新功能 http://news.cnblo ...
- C#TCP通讯框架
开源的C#TCP通讯框架 原来收费的TCP通讯框架开源了,这是一款国外的开源TCP通信框架,使用了一段时间,感觉不错,介绍给大家 框架名称是networkcomms 作者开发了5年多,目前已经停止开发 ...
- Linux 网络编程详解四(流协议与粘包)
TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...
- 利用javascript对提交数据验证
优点:提交前验证.在客户端进行. <html> <head> <script language="javascript"> function c ...