Lucene中内置常用Query对象

以下这几种lucene内置查询对象,不过在实际的项目开发中,这种查询方式应用的不多。一般用QueryParser去获取查询对象。因为QueryParser内部基本实现了所有的内置查询对象。

这是最常见的QueryParse的写法

	/**
	 * 通过QueryParser去获取查询对象
	 *
	 * @throws ParseException
	 */
	@Test
	public void searchByQueryParse() throws ParseException {
		// 1创建QueryParser对象,默认域为content,可以改变
		QueryParser parser = new QueryParser(Version.LUCENE_35, "content",
				new StandardAnalyzer(Version.LUCENE_35));

		// 改变空格的默认操作符,以下可以改为AND
		parser.setDefaultOperator(Operator.AND);

		// 开启第一个字符的通配查询,默认是关闭的,太消耗性能
		parser.setAllowLeadingWildcard(true);

		// 搜索包含content中包含like的
		Query query = parser.parse("like");

		// 查询content中,basketball 和 basketball 的文档
		query = parser.parse("basketball football");

		// 改变搜索域
		query = parser.parse("name:make");

		// 用*或者? 通配符匹配
		query = parser.parse("name:j*");

		// 通配符默认不能放在首位
		query = parser.parse("email:*@itat.org");

		// 查询 名字中没mike,content中like的。 +和- 必须要放在前面
		query = parser.parse("- name:mike + like");

		// 匹配一个区间,TO必须大写
		query = parser.parse("id:[1 TO 6]");

		// 开区间
		query = parser.parse("id:{1 TO 3}");

		/**
		 * 查询字符串中空格的,加上“” 完全匹配
		 */
		query = parser.parse("\"I like football\"");

		// 查询I和football中一个字符距离的
		query = parser.parse("\"I football\"~1");

		// 没办法匹配数字范围,必须要自定义
		query = parser.parse("attach:[2 TO 10]");
		// 模糊匹配
		query = parser.parse("name:make~");

		su.searchByQueryParse(query, 10);
	}

这是对term(最小分词单元)的查询

	/**
	 * 备注:这里的精确匹配查询,是匹配索引文件中的词。
	 * 如果 是搜索英文,忽视大小写
	 * @param field
	 * @param name
	 * @param num
	 */
	public void searchByTerm(String field,String name,int num) {
		try {
			IndexSearcher searcher = getSearcher();
			Query query = new TermQuery(new Term(field,name));
			TopDocs tds = searcher.search(query, num);
			String[] path = FieldCache.DEFAULT.getStrings(reader, "name");
			System.out.println(path.length);
			for(String p:path){
				System.out.println(p);
			}
			System.out.println("查询总数:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs) {
				//System.out.println(sd.score);-查询得分信息
				Document doc = searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"---->"+
						doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
						doc.get("attach")+","+doc.get("date"));
			}
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

多值查询(BooleanQuery)可以用来连接多个子查询:

      /**
	 * 多值查询
	 * @param num
	 */
	public void searchByBoolean(int num) {
		try {
			IndexSearcher searcher = getSearcher();
			BooleanQuery query = new BooleanQuery();
			/*
			 * BooleanQuery连接多值查询
			 * Occur.MUST表示必须出现
			 * Occur.SHOULD表示可以出现
			 * Occur.MUSE_NOT表示必须不能出现
			 */
			query.add(new TermQuery(new Term("name","zhangsan")), Occur.MUST_NOT);
			query.add(new TermQuery(new Term("content","game")),Occur.SHOULD);
			TopDocs tds = searcher.search(query, num);
			System.out.println("命中数:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs) {
				Document doc = searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"---->"+
						doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
						doc.get("attach")+","+doc.get("date"));
			}
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

范围搜索(TermRangeQuery):

      /**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String dir = "D:\\user";

		try {
			Directory directory = FSDirectory.open(new File(dir));
			@SuppressWarnings("deprecation")
			IndexReader reader = IndexReader.open(directory);
			IndexSearcher indexSearcher = new IndexSearcher(reader);
			/**
			 * 范围搜索
			 */
			Term begin = new Term("datetime", "191111");
			Term end = new Term("datetime", "198108");
			/**
			 * 参数Boolean值说明 false表示不包含 191111 true 表示包含198108 这两个Boolean表示查询结果
			 * 是否包含lower,upper两个临界值
			 */
			TermRangeQuery termRangeQuery = new TermRangeQuery("datetime",
					begin.bytes(), end.bytes(), false, true);
			TopDocs topDocs = indexSearcher.search(termRangeQuery, 10);
			ScoreDoc scoreDocs[] = topDocs.scoreDocs;
			for (int i = 0; i < scoreDocs.length; i++) {
				Document document = indexSearcher.doc(scoreDocs[i].doc);
				System.out.println(document.get("id"));
				System.out.println(document.get("name"));
				System.out.println(document.get("text"));
				System.out.println(document.get("datetime"));
			}
			directory.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

数字范围查询:

	public void searchByNumricRange(String field,int start,int end,int num) {
		try {
			IndexSearcher searcher = getSearcher();
			Query query = NumericRangeQuery.newIntRange(field,start, end,true,true);
			TopDocs tds = searcher.search(query, num);
			System.out.println("命中数量:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs) {
				Document doc = searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"---->"+
						doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
						doc.get("attach")+","+doc.get("date"));
			}
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

前缀搜索(PrefixQuery),注意也是对词的前缀搜索:

	/**
	 * 前缀搜索
	 * @param field
	 * @param value
	 * @param num
	 */
	public void searchByPrefix(String field,String value,int num) {
		try {
			IndexSearcher searcher = getSearcher();
			Query query = new PrefixQuery(new Term(field,value));
			TopDocs tds = searcher.search(query, num);
			System.out.println("命中数:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs) {
				Document doc = searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"---->"+
						doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
						doc.get("attach")+","+doc.get("date"));
			}
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

通配符搜索(WildcardQuery)

	/**
	 * 通配符查询 ?和*
	 * @param field
	 * @param value
	 * @param num
	 */
	public void searchByWildcard(String field,String value,int num) {
		try {
			IndexSearcher searcher = getSearcher();
			//在传入的value中可以使用通配符?和*,问号表示匹配一个字符,*表示匹配任意多个字符
			Query query = new WildcardQuery(new Term(field,value));
			TopDocs tds = searcher.search(query, num);
			System.out.println("一共命中数:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs) {
				Document doc = searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"---->"+
						doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
						doc.get("attach")+","+doc.get("date"));
			}
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

短语查询(PhraseQuery),根据零碎的短语组合成新的词组进行搜索,一般应用于英文搜索中

 	public void searchByPhrase(int num) {
		try {
			IndexSearcher searcher = getSearcher();
			PhraseQuery query = new PhraseQuery();
			//设置跳数
			query.setSlop(3);
			query.add(new Term("content","pingpeng"));
			//第一个Term
			query.add(new Term("content","i"));
			//产生距离之后的第一个Term
//			query.add(new Term("content","football"));
			TopDocs tds = searcher.search(query, num);
			System.out.println("命中数:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs) {
				Document doc = searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"---->"+
						doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
						doc.get("attach")+","+doc.get("date"));
			}
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

模糊匹配(searchByFuzzy),允许有个别错误的查询

      	public void searchByFuzzy(int num) {
		try {
			IndexSearcher searcher = getSearcher();
                  //调整相似读
			FuzzyQuery query = new FuzzyQuery(new Term("name","mase"),0.4f,0);
			System.out.println(query.getPrefixLength());
			System.out.println(query.getMinSimilarity());
			TopDocs tds = searcher.search(query, num);
			for(ScoreDoc sd:tds.scoreDocs) {
				Document doc = searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"---->"+
						doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
						doc.get("attach")+","+doc.get("date"));
			}
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
时间: 2024-08-07 18:54:22

Lucene中内置常用Query对象的相关文章

ES6新特性:Javascript中内置的延迟对象Promise

Promise的基本使用: 利用Promise是解决JS异步执行时候回调函数嵌套回调函数的问题, 更简洁地控制函数执行流程: 通过new实例化Promise,  构造函数需要两个参数, 第一个参数为函数执行成功以后执行的函数resolve, 第二个函数为函数执行失败以后执行的函数reject: new Promise(function(resolve , reject) { }); 通过Promise,我们把回调函数用线性的方式写出来,而不是一层套一层, 这个函数有四层回调: fn("args&

函数中内置对象

函数的3大内置对象,在这里只写了2个,其中一个比较重要,而且在工作中很多人搞不懂,this到底代表谁.所以我单独写出来了 函数中内置的三大对象 1.arguments对象 2.环境变量对象 3.this对象 arguments对象 用于保存实参(它只存在于函数中,函数外不能调用,具有数组所有的功能,但它不是数组) arguments对象通过索引值来访问保存在其中的实参值 <script type="text/javascript"> function show(a,b){

JavaScript中内置对象的一些属性及方法

Javascript对象总结 JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象 Array对象中常用方法: Concat():表示把几个数组合并成一个数组. Join():返回字符串值,其中包含了连接到一起的数组的所有元素,元素由指定的分隔符分隔开来. Pop():移除数组最后一个元素. Shift():移除数组中第一个元素. unshift():在数组的第一项Slice(start,end):返回数组中的一段. Push():往数

DataGridView中内置控件常用事件使用心得

checkbox,button,imagebutton使用dataGridView1_CellContentClick private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { tb.Text+=string.Format("\r\n{0},Row:{1},Column:{2}","单元格内容单击!",e.RowIndex,e.ColumnInd

python内置常用高阶函数(列出了5个常用的)

原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://blog.csdn.net/cv_you/article/details/70880405 python内置常用高阶函数: 一.函数式编程 •函数本身可以赋值给变量,赋值后变量为函数: •允许将函数本身作为参数传入另一个函数: •允许返回一个函数. 1.map()函数 是 Python 内置的高阶函数,

【Unity】3.1 利用内置的3D对象创建三维模型

分类:Unity.C#.VS2015 创建日期:2016-04-02 一.基本概念 Unity已经内置了一些基本的3D对象,利用这些内置的3D对象就可以直接构建出各种3D模型(当然,复杂的三维模型还需要借助专业建模软件来完成). Unity 5.3.4内置的3D对象有: Cube:立方体 Sphere:球体 Capsule:胶囊体. Cylinder:圆柱体. Plane:平面. Quad:四方格. Ragdoll:布娃娃系统. Terrain:地形. Tree:树. Wind Zone:风.

Update升级包中内置第三方app案例

Update升级包中内置第三方app案例 Update升级包中内置第三方app案例 介绍 总结内容 1 问题现象 2 原因分析 3 解决方案 Androidmk preinstallsh 4 后续工作中须注意细节 扩展阅读 1. 介绍 Amlogic MX8726 5iHome项目,客户提出需求在固件中预制第三方app 请列出开发的项目,项目简单背景,使用的平台,待总结的内容简述 2. 总结内容 2.1 问题现象: 客户提供第三方app直接使用U盘pm install YouKu_CIBN.ap

java8中内置的四大核心函数式接口

java8中内置的四大核心函数式接口 Consumer<T>:消费型接口 void accept(T t) //Consumer<T> 消费型接口 public void happy(double money, Consumer<Double> con){ con.accept(money); } Supplier<T>:供给型接口 T get(); //Supplier<T> 供给型接口 //需求:产生一些整数,并放入集合中 public Li

CLR环境中内置了几个常用委托(转)

CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个委托了,就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范.一.Action Action封装的方法没有参数也没有返回值,声明原型为: 1 public delegate void Action(); 用法如下: public void Alert() { Console.WriteLine(&q