lucene+heritrix day3(3)

shibenjie 2008-04-03 04:01:06
由于测试程序过长,所以分成了贴,如果您看着不方便,请谅解哦 。。。
/**
* 多短语所搜
*
* @param path
* @throws IOException
*/
public static void multiPhraseQuery(String path) throws IOException {
IndexSearcher searcher = new IndexSearcher(path);
// 构建一个MultiPhraseQuery对象
MultiPhraseQuery query = new MultiPhraseQuery();
// 首先向query中加入要查找的词语的前缀
query.add(new Term("bookname", "钢"));
// 构建三个Term作为词语后缀
Term t1 = new Term("bookname", "铁");
Term t2 = new Term("bookname", "到");
// 在向query中加入所有的词语后缀
// 这表示lucene最终搜索结果将包括所有具有“钢铁”,“刚到”这两个短语的文档
query.add(new Term[] { t1, t2 });
Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i));
}

searcher.close();
}

/**
* 短语搜索
*
* @param path
* @throws IOException
*/
public static void phraseQuery(String path) throws IOException {
IndexSearcher searcher = new IndexSearcher(path);
Term t1 = new Term("bookname", "钢");
Term t2 = new Term("bookname", "铁");
// 进行短语搜索,搜索含“钢铁”这个词语的文档Document
PhraseQuery query = new PhraseQuery();
query.add(t1);
query.add(t2);
// PhraseQuery还有一个坡度值,可以设置允许搜索的关键字之间插入一个或多个无关紧要的词
// 设置“刚”和“铁”之间可以混有0个或一个无关紧要的字
query.setSlop(1);
Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i));
}
searcher.close();
}

/**
* 前缀搜索
*
* @param path
* @throws IOException
*/
public static void prefixQuery(String path) throws IOException {
IndexSearcher searcher = new IndexSearcher(path);
// 构建一个Term用于表示查询的前缀
Term t = new Term("bookname", "钢");
// prefixQuery的构造函数只有一个,就是用Term来构造
PrefixQuery query = new PrefixQuery(t);
Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i));
}
searcher.close();
}

/**
* 范围搜索
*
* @param path
* @throws IOException
*/
public static void rangeQuery(String path) throws IOException {
IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(),
false);

Document doc1 = new Document();
Document doc2 = new Document();
Document doc3 = new Document();
Document doc4 = new Document();
Document doc5 = new Document();
Document doc6 = new Document();
Document doc7 = new Document();
Document doc8 = new Document();

Field f1 = new Field("booknumber", "00001", Field.Store.YES,
Field.Index.TOKENIZED);
Field f2 = new Field("booknumber", "00002", Field.Store.YES,
Field.Index.TOKENIZED);
Field f3 = new Field("booknumber", "00003", Field.Store.YES,
Field.Index.TOKENIZED);
Field f4 = new Field("booknumber", "00008", Field.Store.YES,
Field.Index.TOKENIZED);
Field f5 = new Field("booknumber", "00005", Field.Store.YES,
Field.Index.TOKENIZED);
Field f6 = new Field("booknumber", "00006", Field.Store.YES,
Field.Index.TOKENIZED);
Field f7 = new Field("booknumber", "00007", Field.Store.YES,
Field.Index.TOKENIZED);
Field f8 = new Field("booknumber", "00004", Field.Store.YES,
Field.Index.TOKENIZED);

doc1.add(f1);
doc2.add(f2);
doc3.add(f3);
doc4.add(f4);
doc5.add(f5);
doc6.add(f6);
doc7.add(f7);
doc8.add(f8);

writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);
writer.addDocument(doc4);
writer.addDocument(doc5);
writer.addDocument(doc6);
writer.addDocument(doc7);
writer.addDocument(doc8);
writer.close();

Term t1 = new Term("booknumber", "00001");
Term t2 = new Term("booknumber", "00006");

// 检索位于上下界间的所有文档
IndexSearcher searcher = new IndexSearcher(path);
RangeQuery query = new RangeQuery(t1, t2, false);
Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i));
System.out.println(hits.id(i));
System.out.println("**********************************");
}
searcher.close();

}

/**
* 布尔搜索
*
* @param path
* @throws IOException
*/
public static void booleanQuery1(String path) throws IOException {
IndexSearcher searcher = new IndexSearcher(path);
// 创建三个词条
Term t1 = new Term("bookname", "女");
Term t2 = new Term("bookname", "人");
Term t3 = new Term("bookname", "狗");
// 创建三个Query
Query q1 = new TermQuery(t1);
Query q2 = new TermQuery(t2);
Query q3 = new TermQuery(t3);

// 查询逻辑包含“女”和“人”,但不包含“狗”的
BooleanQuery query = new BooleanQuery();
query.add(q1, BooleanClause.Occur.MUST);
query.add(q2, BooleanClause.Occur.MUST);
query.add(q3, BooleanClause.Occur.MUST_NOT);

Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println("×××××××××××××××××××");
System.out.println(hits.doc(i));
System.out.println(hits.score(i));
System.out.println(hits.id(i));
System.out.println("×××××××××××××××××××");
}

searcher.close();

}

public static void booleanQuery(String path) throws IOException {
IndexSearcher searcher = new IndexSearcher(path);

// 创建两个词条对象
Term t1 = new Term("bookname", "女");
Term t2 = new Term("bookname", "狗");

// 创建两个TermQuery
Query q1 = new TermQuery(t1);
Query q2 = new TermQuery(t2);

// 创建BooleanQuery
BooleanQuery query = new BooleanQuery();
// 将两个TermQuery加入BooleanQuery的字句中,且关系均为必须满足
query.add(q1, BooleanClause.Occur.MUST);
query.add(q2, BooleanClause.Occur.MUST);
// query.add(q2,BooleanClause.Occur.SHOULD);
// query.add(q2,BooleanClause.Occur.MUST_NOT);

// 打印查询结果
Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println("×××××××××××××××××××");
System.out.println(hits.doc(i));
System.out.println(hits.score(i));
System.out.println(hits.id(i));
System.out.println("×××××××××××××××××××");
}
searcher.close();
}

public static void searcherScore(String path) throws IOException {
IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(), true);
writer.setUseCompoundFile(false);
// 先创建8个文档
Document doc1 = new Document();
Document doc2 = new Document();
Document doc3 = new Document();
Document doc4 = new Document();
Document doc5 = new Document();
Document doc6 = new Document();
Document doc7 = new Document();
Document doc8 = new Document();

Field f1 = new Field("bookname", "钢铁是怎样炼成的", Field.Store.YES,
Field.Index.TOKENIZED);
Field f2 = new Field("bookname", "英雄儿女", Field.Store.YES,
Field.Index.TOKENIZED);
Field f3 = new Field("bookname", "篱笆女人和狗", Field.Store.YES,
Field.Index.TOKENIZED);
// 设置f3的激进因子,把该域设置为较低的值,从而降低文档的得分
f3.setBoost(0.1f);
Field f4 = new Field("bookname", "女人是月亮", Field.Store.YES,
Field.Index.TOKENIZED);
Field f5 = new Field("bookname", "我的兄弟和女儿", Field.Store.YES,
Field.Index.TOKENIZED);
Field f6 = new Field("bookname", "白毛女", Field.Store.YES,
Field.Index.TOKENIZED);
Field f7 = new Field("bookname", "钢到世界", Field.Store.YES,
Field.Index.TOKENIZED);
Field f8 = new Field("bookname", "钢铁男人", Field.Store.YES,
Field.Index.TOKENIZED);

doc1.add(f1);
doc2.add(f2);
doc3.add(f3);
doc4.add(f4);
doc5.add(f5);
doc6.add(f6);
doc7.add(f7);
doc8.add(f8);

writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);
writer.addDocument(doc4);
writer.addDocument(doc5);
writer.addDocument(doc6);
writer.addDocument(doc7);
writer.addDocument(doc8);

writer.close();

// 检索
IndexSearcher searcher = new IndexSearcher(path);
Term t = new Term("bookname", "女");
Query q = new TermQuery(t);
Hits hits = searcher.search(q);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i));
}
searcher.close();
}
}
...全文
56 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoxu1987728 2008-04-24
  • 打赏
  • 举报
回复
很好很好,我喜欢代码
  • 打赏
  • 举报
回复
9494,都不知道在做什么,一个说明都没有
吴冬冬 2008-04-03
  • 打赏
  • 举报
回复
= = 贴源代码干什么?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧