边学边记(三) TermQuery

根据前面博文 http://blog.csdn.net/a276202460/archive/2010/05/25/5623829.aspx

中写到的查询的基类,测试下termquery的使用,不多说写代码 写到哪算哪

 

/****************
 *
 *Create Class:TermQuerySearch.java
 *Author:a276202460
 *Create at:2010-5-25
 */
package com.rich.lucene.searcher;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.util.Version;
import com.rich.lucene.util.IndexKeys;
public class TermQuerySearch extends Searcher {
	public static void main(String[] s) throws Exception {
		// private final String[] bizes = { "db", "ws", "jms", "lucene" };
		/*
		 * doc.add(new Field(IndexKeys.TEST_BIZ, bizes[random
		 * .nextInt(bizes.length)], Field.Store.YES, Field.Index.NOT_ANALYZED));
		 * 索引在创建的时候并没有对此字段进行分词 因为只有一个字段分不分词没效果
		 */
		TermQuery termquery = new TermQuery(new Term(IndexKeys.TEST_BIZ, "db"));
		TermQuerySearch searcher = new TermQuerySearch();
		searcher.Search(termquery);
		/*
		 * 查询的结果总数为250307 和当初创建索引的时候 逻辑上是对上了 100W随机4个值 每个值25W左右 >>>>>>>>>>>>
		 * User Query:testbiz:db >>>>>>>>>>>> Query Use:31ms >>>>>>>>>>>> Total
		 * Result:250307
		 * 这样的查询看起来和数据库查询中的where biz = 'db' 差不多只是做了一个等的查询 和baidu google
		 * 的查询时有些不一样 这样操作大DB的query还是很方便的 既然作索引的时候用到了分词器 查询的时候对于搜索
		 * 文本的切割和比重计算应该也是必须的 比如一片文章中有java lucene weblogic 将这三个词作为搜索文本
		 * 应该能搜索到所有包含这些词中的最少一个就可以作为结果返回 当然要看切词器怎么切分搜索文本切分为几个词
		 */
		QueryParser parser = new QueryParser(Version.LUCENE_CURRENT,
				IndexKeys.TEST_BIZ, searcher.getAnalyzer());
		Query analyzquery = parser.parse("db ws");
		searcher.Search(analyzquery);
		/*
		 * 这样查询结果就是
		 * >>>>>>>>>>>> User Query:testbiz:db testbiz:ws
           >>>>>>>>>>>> Query Use:110ms
           >>>>>>>>>>>> Total Result:499645
         * Query的tostring可以看出来 相当于termquery的两个查询 关系吗就是sql中的or逻辑了
         * 在测试下针对大文本的带分词的所关键词查询看看是不是or呢 其实我也不知道
		 */
		
		QueryParser contentparser = new QueryParser(Version.LUCENE_CURRENT,
				IndexKeys.TEST_CONTENT, searcher.getAnalyzer());
		Query  contentquery = contentparser.parse("java lucene web jsp");
		searcher.Search(contentquery);
	    /*
	     * >>>>>>>>>>>> User Query:testcontent:java testcontent:lucene testcontent:web testcontent:jsp
           >>>>>>>>>>>> Query Use:1234ms
           >>>>>>>>>>>> Total Result:1000000
         *看样子还是一个简单的or的逻辑并不知道权重怎么弄的
         * static public enum Operator { OR, AND }
         * QueryParser中的这个东西似乎可以确定or和and的关系 用AND和OR代替空格看看
	     */
		
		QueryParser contentandparser = new QueryParser(Version.LUCENE_CURRENT,
				IndexKeys.TEST_CONTENT, searcher.getAnalyzer());
		Query  contentandquery = contentandparser.parse("java AND lucene AND web AND jsp");
		searcher.Search(contentandquery);
		/*
		 * >>>>>>>>>>>> User Query:+testcontent:java +testcontent:lucene +testcontent:web +testcontent:jsp
           >>>>>>>>>>>> Query Use:1062ms
           >>>>>>>>>>>> Total Result:1000000//结果还是100W 应该是内容里随机出这些单词的几率很大吧毕竟1000个单词了 用BIZ在后面试下
           看样子用and作为分隔关键字查询的就是AND的逻辑了默认的及时OR了 当然肯定还可以用OR作为分隔符
		 */
		
		QueryParser contentorparser = new QueryParser(Version.LUCENE_CURRENT,
				IndexKeys.TEST_CONTENT, searcher.getAnalyzer());
		Query  contentorquery = contentorparser.parse("java OR lucene OR web OR jsp");
		searcher.Search(contentorquery);
		
		/************************************
		>>>>>>>>>>>> User Query:testcontent:java testcontent:lucene testcontent:web testcontent:jsp
		>>>>>>>>>>>> Query Use:750ms
		>>>>>>>>>>>> Total Result:1000000
		和用分隔符表示出来的查询的字符串表示是一样的
		************************************/
		
		QueryParser bizandparser = new QueryParser(Version.LUCENE_CURRENT,
				IndexKeys.TEST_BIZ, searcher.getAnalyzer());
		Query bizandquery = bizandparser.parse("db AND ws");
		searcher.Search(bizandquery);
		/************************************
		>>>>>>>>>>>> User Query:+testbiz:db +testbiz:ws
		>>>>>>>>>>>> Query Use:47ms
		>>>>>>>>>>>> Total Result:0
		************************************/
	}
}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值