BoostQuery.java
上传用户:cctqzzy
上传日期:2022-03-14
资源大小:12198k
文件大小:4k
源码类别:

搜索引擎

开发平台:

Java

  1. package chapter7;
  2. import java.io.IOException;
  3. import java.util.Date;
  4. import org.apache.lucene.index.Term;
  5. import org.apache.lucene.document.Field;
  6. import org.apache.lucene.document.Document;
  7. import org.apache.lucene.index.IndexWriter;
  8. import org.apache.lucene.analysis.Analyzer;
  9. import org.apache.lucene.analysis.SimpleAnalyzer;
  10. import org.apache.lucene.search.Query;
  11. import org.apache.lucene.search.Hits;
  12. import org.apache.lucene.search.TermQuery;
  13. import org.apache.lucene.search.IndexSearcher;
  14. import org.apache.lucene.queryParser.*;
  15. import org.apache.lucene.search.*;
  16. import org.apache.lucene.search.BooleanQuery;
  17. import org.apache.lucene.store.Directory; 
  18. import org.apache.lucene.store.RAMDirectory;
  19. import org.apache.lucene.search.DefaultSimilarity;
  20. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  21. import org.apache.lucene.search.payloads.BoostingTermQuery;
  22. public class BoostQuery {
  23. private static final String[] ContentList = { "good Lucene cd ", 
  24.            "good cd ,good book", 
  25.            "good book",
  26.            "Lucene book good" };
  27. private static final String F = "f";
  28. private static final String Term1 = "Lucene";
  29. private static final String Term2 = "good";
  30. private static Directory directory;
  31. private static Analyzer analyzer;
  32. public static void main(String[] args) throws IOException{
  33. directory = new RAMDirectory();
  34. CreateIndex();
  35. searchIndex();
  36. }
  37. private static void CreateIndex() throws IOException{
  38. analyzer = new StandardAnalyzer();
  39. IndexWriter writer = new IndexWriter( directory, analyzer );
  40. for( String content : ContentList ){
  41. Document doc = new Document();
  42. Field f = new Field( F, content, Field.Store.YES, Field.Index.TOKENIZED );
  43. f.setOmitNorms( true );
  44. doc.add( f );
  45. writer.addDocument( doc );
  46. }
  47. writer.close();
  48. }
  49. private static void searchIndex() throws IOException{
  50. IndexSearcher searcher = new IndexSearcher( directory );
  51. searcher.setSimilarity( new PayloadSimilarity() );
  52. BooleanQuery query = new BooleanQuery();
  53. Query termqery1 = new TermQuery( new Term( F, Term1 ) );
  54. Query termqery2 = new TermQuery( new Term( F, Term2 ) );
  55. query.add( termqery1, BooleanClause.Occur.SHOULD );
  56. query.add( termqery2, BooleanClause.Occur.SHOULD );
  57. /*
  58. Query btermqery1 = new BoostingTermQuery( new Term( F, Term1 ) );
  59. Query btermqery2 = new BoostingTermQuery( new Term( F, Term2 ) );
  60. query.add( btermqery1, BooleanClause.Occur.SHOULD );
  61. query.add( btermqery2, BooleanClause.Occur.SHOULD );
  62. */
  63. Hits hits = searcher.search( query );
  64. for( int i = 0; i < hits.length(); i++ ){
  65. Document doc = hits.doc( i );
  66. int id = hits.id( i );
  67. float score = hits.score( i );
  68. System.out.println( score + " : " + doc.get( F ) );
  69. //Explanation exp = searcher.explain( query, id );
  70. //System.out.println( exp.toString() );
  71. }
  72. searcher.close();
  73. }
  74. static class PayloadSimilarity extends DefaultSimilarity
  75. {
  76. private static final String POS_NAME = "good";
  77. public float scorePayload(byte[] payload, int offset, int length){
  78. return isName( payload, offset, length ) ? 2.0f : 1.0f;
  79. }
  80. private static boolean isName( byte[] payload, int offset, int length ){
  81. String paystr = new String( payload, offset, length );
  82. return paystr.indexOf( POS_NAME ) >= 0 ? true : false;
  83. }
  84. }
  85. public float lengthNorm(String fieldName, int numTerms) {
  86.     return 1;
  87.   }
  88.   public float queryNorm(float sumOfSquaredWeights) {
  89.     return 1;
  90.   }
  91.   public float sloppyFreq(int distance) {
  92.     return 1;
  93.   }
  94.   public float coord(int overlap, int maxOverlap) {
  95.     return 1;
  96.   }
  97.   public float idf(int docFreq, int numDocs) {
  98.     return 1;
  99.   }
  100.   public float tf(float freq) {
  101.     return 1;
  102.   }
  103. }