Lucene中内置常用Query对象

标签: lucene query 对象 | 发表时间:2014-12-04 04:34 | 作者:hu948162999
出处:http://blog.csdn.net

       以下这几种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();
		}
	}


作者:hu948162999 发表于2014-12-3 20:34:07 原文链接
阅读:15 评论:0 查看评论

相关 [lucene query 对象] 推荐:

Lucene中内置常用Query对象

- - CSDN博客推荐文章
       以下这几种lucene内置查询对象,不过在实际的项目开发中,这种查询方式应用的不多. 一 般用QueryParser去获取查询对象. 因为QueryParser内部基本实现了所有的内置查询对象.       这是最常见的QueryParse的写法. * 通过QueryParser去获取查询对象.

巧用query cache

- - OurMySQL
   收到一用户反馈其应用日志中狂报错误,获取连接超时:. 同时应用报错超出了数据库的最大连接数:max connections:. 这种情况很有可能是有慢sql占用了连接池中的连接没有释放,导致后续进来的请求迟迟获取不到连接池中的连接,导致请求报错,登录数据库排查发现如下sql出现执行非常的慢:.

MySQL Query Cache 小结

- Eneri - Sky.Jian 朝阳的天空
最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考. 顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的. 具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集.

elasticsearch的javaAPI之query

- - CSDN博客云计算推荐文章
elasticsearch的javaAPI之query API. the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits). 它可以在跨一个或多个index上执行, 或者一个或多个types. 查询可以使用提供的 query Java API 或filter Java API.

MySQL Query Cache 小结

- - Sky.Jian 朝阳的天空
最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考. 顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的. 具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集.

lucene排序

- - 开源软件 - ITeye博客
排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最高或卖的最好的商品,再比如在Iteye里的博客栏里,每天都会以降序的方式,来显示出最新发出的几篇博客,有了排序,我们就能在某些时候很方便快速的得到某些有效信息,所以说排序功能,无处不在 ^_^.

[原]Lucene系列-facet

- - 文武天下
facet:面、切面、方面. 个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品. 其中品牌、网络、价格就是商品的维度(facet),点击某个品牌或者网络,获取更细分的结果. 点击品牌小米,获得小米手机的结果,显示27个.

[原]Lucene系列-FieldCache

- - 文武天下
域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但访问速度比较慢,而且只能获得Stored域的值. FieldCache能获得域值数组,根据docId random access域值.

Lucene 使用教程

- - 行业应用 - ITeye博客
1 lucene简介 . 1.1 什么是lucene . Lucene是一个全文搜索框架,而不是应用产品. 因此它并不像 http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品. 1.2 lucene能做什么 . 要回答这个问题,先要了解lucene的本质.

Lucene 4.x 之 IndexReader

- - zzm
在Lucene 3.x时代,《Lucene In Action》是一本相当不错的参考书,书中详细介绍了Lucene各种高级使用技术,对于开发者来说非常实用. 但是近期Lucene升级到了4.x版本,在性能等各方面有了很大的提高,值得在新项目中使用. 然而Lucene 4.x中的API相比3.x来说有了很大的改变,《Lucene In Action》中的很多内容都已经过时了,并且由于4.x推出的时间不长,还没有比较好的文档来对用法进行说明,这个系列文章就是想记录下自己使用Lucene 4.x的经验体会,供大家参考使用.