欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Lucene实现一个简单的布尔搜索功能

程序员文章站 2024-02-29 23:34:58
什么是lucene lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全...

什么是lucene

lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。

    lucene是一个全文搜索框架,而不是应用产品。因此它并不像 或者google desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。

 在布尔查询的对象中,包含一个子句的集合,各个子句间都是如“与”、“或”这样的布尔逻辑。lucene中所遇到的各种复杂查询,最终都可以表示成布尔型的查询。下面代码就是实现了一个简单的布尔查询。

package lucenesearch; 
import org.apache.lucene.analysis.standard.standardanalyzer; 
import org.apache.lucene.document.document; 
import org.apache.lucene.document.field; 
import org.apache.lucene.index.indexwriter; 
import org.apache.lucene.index.term; 
import org.apache.lucene.search.booleanclause; 
import org.apache.lucene.search.booleanquery; 
import org.apache.lucene.search.hits; 
import org.apache.lucene.search.indexsearcher; 
import org.apache.lucene.search.termquery; 
/** 
 * 布尔搜索测试 
 * @author sdu20 
 * 
 */ 
public class booleanquerytest { 
 static final string index_store_path = "e:\\编程局\\java编程处\\index\\"; 
 public static void main(string[] args) { 
 // todo auto-generated method stub 
 try{ 
  indexwriter writer = new indexwriter(index_store_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); 
  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(); 
  system.out.println("创建索引成功"); 
  indexsearcher searcher = new indexsearcher(index_store_path); 
  //创建两个词条对象 
  term t1 = new term("bookname","生"); 
  term t2 = new term("bookname","记"); 
  termquery q1 = new termquery(t1); 
  termquery q2 = new termquery(t2); 
  booleanquery query = new booleanquery(); 
  query.add(q1,booleanclause.occur.must); 
  query.add(q2,booleanclause.occur.must); 
  hits hits = searcher.search(query); 
  for(int i = 0;i<hits.length();i++){ 
  system.out.println(hits.doc(i)); 
  } 
  system.out.println("搜索成功"); 
 }catch(exception e){ 
  system.out.println(e.getstacktrace()); 
 } 
 } 
} 

booleanclause.occur类主要有3种表示,即must、must_not和should。must与must_not不难理解,一看名字就知道是什么意思,而should是一个比较特殊的约束,当它与must联用时,它将失去意义。检索的结果为must子句的检索结果。当它与must_not联用时,should的功能就与must一样,就退变为must和must_not的查询结果。当should与should联用时,它们就表示一种“或”关系。最终检索结果为所有检索子句的检索结果的并集。

上面代码就是查询索引中有“生”字和“记”字的文档,程序运行结果截图如下

使用Lucene实现一个简单的布尔搜索功能

索引目录文件夹下截图如下

使用Lucene实现一个简单的布尔搜索功能

以上所述是小编给大家介绍的使用lucene实现一个简单的布尔搜索功能,希望对大家有所帮助