天天看點

Lucene 的查詢方式|排序

Lucene 查詢中有兩種查詢方式:使用字元串查詢[可以使用特定的查詢文法]    使用對像查詢[查詢對象,通過它的子類來實作]

Query 查詢:TermQuery 關鍵字查詢  RangeQuery 範圍查詢  WildcardQuery 短語查詢   BooleanQuery 布爾查詢

private String indexPath="D://ec_pj//LuceneDemo1//luceneIndex";

 private Analyzer analyzer=new MMAnalyzer();

 @Test

 public void test(){

 }

 @Test

 public void testTermQuery()throws Exception{

  //Term term=new Term("content","老婆");

  //Term term=new Term("content","KEY");  //關鍵詞中沒有大寫,均為小寫字元

  Term term=new Term("content","key");

  Query query=new TermQuery(term);

  List<Document> resultList=search(query);

  for (Document doc : resultList) {

   System.out.println(doc.get("name"));

   System.out.println(doc.get("content"));

   System.out.println(doc.get("size"));

   System.out.println(doc.get("path"));

  }

 }

 @Test

 public void testRangeQuery()throws Exception{

  Term lowerTerm=new Term("size",NumberTools.longToString(70));     //範圍大小是按字元串比較大小的  

  Term upperTerm=new Term("size",NumberTools.longToString(2045));

  //NumberTools.longToString(200)  使用工具類,轉為化字元串采用36進制存儲  采用工具類時,建立索引時也要使用該工具類

  Query query=new RangeQuery(lowerTerm, upperTerm, true);  //boolean 是否包含邊界

  System.out.println(query.toString());

  List<Document> resultList=search(query);

  for (Document doc : resultList) {

   System.out.println(doc.get("name"));

   System.out.println(doc.get("content"));

   System.out.println(doc.get("size"));

   System.out.println(doc.get("path"));

  }

 }

 同樣的日期的處理也有對應的工具類:DateTools

DateTools.dateToString(new Date(), Resolution.DAY)

 @Test

 public void testPhraseQuery()throws Exception{

  PhraseQuery query=new PhraseQuery();

//  query.add(new Term("content","snta"),1);

//  query.add(new Term("content","love"),3);

  query.add(new Term("content","code"));

  query.add(new Term("content","love"));

  //設定兩個關鍵字中間可以隔多少個單鍵詞

  query.setSlop(5);   //會覆寫前面的設定,如果是0代表位置精确比對

  List<Document> resultList=search(query);

  printResult(resultList);

 }

 @Test

 public void testBooleanQuery()throws Exception{

  Term term=new Term("content","snt?");

  Query query1=new WildcardQuery(term);

  PhraseQuery query2=new PhraseQuery();

  query2.add(new Term("content","code"));

  query2.add(new Term("content","love"));

  query2.setSlop(5);

  BooleanQuery query=new BooleanQuery();

  query.add(query1, Occur.MUST_NOT);

  query.add(query2, Occur.SHOULD);

  List<Document> resultList=search(query);

  printResult(resultList);

 }

查詢文法:content:李樂平    字段:關鍵字   content:key

範圍查詢:字段:[100000 TO 200000]  格式  size:(2 to 4)  size:[2,4]

通配符查詢:  name:lov?

短語查詢:  content:"? 我 ? ? ? 喜歡 "     content:"我 喜歡"~2   中間至多想隔兩個關鍵字

布爾查詢:  +content:snt? -content:"code love"~5    +代表必須的  -必須排除   MUST和MUST_NOT

如果:SHOULD SHOULD 沒有符号   content:snt? content:"code love"~5

AND OR NOT

@Test

 public void testQueryString()throws Exception{

//  String query="content:snt?  AND  content:/"code love/"~5";

//  String query="content:snt?  OR  content:/"code love/"~5";

  String query="content:snt?  NOT  content:/"code love/"~5";

  //多個條件組合可以加括号

  List<Document> resultList=search(query);

  printResult(resultList);

 }

 搜尋結果的排序      預設根據相關度排序   也可以按照指定的規則排序

可以影響相關度排序,指定Field的boost屬性[預設值為1.0f]   指定Document的boost 值

在檢索前指定上面的boost值   在建立索引時指定boost值

Document doc=File2DocumentUtils.file2Document(filePath);

  //doc.setBoost(2f);

  Document doc1=File2DocumentUtils.file2Document(filePath1);

  //doc1.setBoost(5f);

  IndexWriter iw=new IndexWriter(FSDirectory.getDirectory(new File(indexPath)),analyzer,true,MaxFieldLength.LIMITED);

  iw.addDocument(doc);

  iw.addDocument(doc1);

  iw.close();

//boosts.put("name", 3f);

  //boosts.put("document", 2f);

  QueryParser queryParser=new MultiFieldQueryParser(new String[]{"name","content"},analyzer,boosts);

查詢search()  方法最後一個參數是個排序條件

  Sort sort=new Sort();

  sort.setSort("size", true);   //如果為true,降序

  TopDocs topdocs=is.search(query, null, 10000,sort);

過濾器 Filter  過濾器的使用會對檢索性能産生很大影響

Filter filter=new RangeFilter("size", NumberTools.longToString(200), NumberTools.longToString(2550), true, true);

  TopDocs topdocs=is.search(query, filter, 10000,sort);