现在的位置: 首页 > 综合 > 正文

Lucene进阶:and 和or的条件查询

2018年01月09日 ⁄ 综合 ⁄ 共 2229字 ⁄ 字号 评论关闭

 
在用Lucene实现全站搜索的过程中,很可能会遇到这样的问题,只所有某种特定的信息资源,而不是全部.如:某综合性站点,有新闻,产品,论
坛,Blog,视频等资源,而搜索的时候先选一个类型(下拉列表),再输入关键字进行搜索(当然,这种情况可以直接用sql来实现,我们这里是基于
lucene的实现考虑).这种情况下,就要用到and和or的查询了.这里假设索引已经建立好了(如何建立索引请参
考:http://www.javaeye.com/topic/125599),索引字段为title(标题),
type(资源类型,表示新闻还是产品,product为产品,news表新闻),则实现方法如下:

Java代码
  1. /**
     
  2. * 根据信息分类和关键词进行查询
     
  3. * @param type,资源的类型,其值为news或product
     
  4. * @param searchKey,搜索的关键字
     
  5. * @return Hits
     
  6. */
      
  7. public
     Hits executeSearch(String type,String keyword)  
  8. {  
  9.   Hits result = null
    ;  
  10.   if
    (type != 
    null
     && !type.equals(
    ""
    ) && keyword != 
    null
     && !keyword.equals(
    ""
    ))  
  11.   {  
  12.     try
       
  13.     {  
  14.       //根据关键字构造一个数组
      
  15.       String[] key = new
     String[]{keyword,type};  
  16.       //同时声明一个与之对应的字段数组
      
  17.       String[] fields = {"title"
    ,
    "type"
    };  
  18.       //声明BooleanClause.Occur[]数组,它表示多个条件之间的关系
      
  19.       BooleanClause.Occur[] flags=new
     BooleanClause.Occur[]{BooleanClause.Occur.MUST,BooleanClause.Occur.MUST};  
  20.       ChineseAnalyzer analyzer = new
     ChineseAnalyzer();  
  21.       //用MultiFieldQueryParser得到query对象
      
  22.       Query query = MultiFieldQueryParser.parse(key, fields, flags, analyzer);  
  23.       //c:/index表示我们的索引文件所在的目录
      
  24.       IndexSearcher searcher = new
     IndexSearcher(
    "c:/index"
    );  
  25.       //查询结果
      
  26.       result = searcher.search(query);  
  27.     } catch
     (Exception e)  
  28.     {  
  29.       e.printStackTrace();  
  30.     }  
  31.   }  
  32.   return
     result;  
  33. }  


这里需要注意的就是BooleanClause.Occur[]数组,它表示多个条件之间的关
系,BooleanClause.Occur.MUST表示and,BooleanClause.Occur.MUST_NOT表示
not,BooleanClause.Occur.SHOULD表示or.

抱歉!评论已关闭.