根据前面博文 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
************************************/
}
}