2013-04-10 39 views
0

我目前通過Hibernate Search的準備4.1Hibernate Search的+ Lucene和操作員查詢

我有一個表(file_data,文件名) 我想創建一個查詢像 file_data:XYZ和文件名:abc.pdf

如何執行此查詢? 下面我儘量讓查詢這個..

Query luceQry3 = queryBuilder 
        .bool() 
        .must(
          queryBuilder 
          .bool() 
           .must(
             queryBuilder. 
             keyword(). 
             onField("file_data") 
             .ignoreFieldBridge() 
             .matching("HDFC") 
             .createQuery()).createQuery()) 
        .must(queryBuilder. 
          keyword(). 
          onField("fileName") 
          .ignoreFieldBridge() 
          .matching("0_119.pdf") 
          .createQuery()).createQuery(); 

但此查詢和

Query luceneQry = queryBuilder.keyword(). 
         onField("file_data").ignoreFieldBridge(). 
         matching("HDFC"). 
         createQuery(); 

返回相同的結果。 我想使用AND運算符,這樣我可以最小化查詢結果。

-------我的實體映射如下-----

@Entity 
@Table(name="file_upload") 
@Indexed 
@Analyzer(impl = org.apache.lucene.analysis.standard.StandardAnalyzer.class) 
public class FileUploadModel implements Serializable { 


    private static final long serialVersionUID = -5376124674712529869L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Field(index=Index.YES,store=Store.NO) 
    @DocumentId 
    private Integer file_upload_id; 

    @Column(name="file_name") 
    @Field(index=Index.YES,store=Store.YES) 
    private String fileName; 

    @IndexedEmbedded 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="user_id") 
    private User user; 

    @Column(name="file_type") 
    private String file_type; 


    @Column(name="file_data") 
    @Lob 
    @Field(index=Index.YES,store=Store.NO,name="file_data") 
    @FieldBridge(impl=com.test.documentsearch.core.BlobToString.class) 
    private byte[] file_data; 

    public Integer getFile_upload_id() { 
     return file_upload_id; 
    } 

    public void setFile_upload_id(Integer file_upload_id) { 
     this.file_upload_id = file_upload_id; 
    } 

    public String getFileName() { 
     return fileName; 
    } 

    public void setFileName(String fileName) { 
     this.fileName = fileName; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 


    public String getFile_type() { 
     return file_type; 
    } 


    public void setFile_type(String file_type) { 
     this.file_type = file_type; 
    } 


    public byte[] getFile_data() { 
     return file_data; 
    } 


    public void setFile_data(byte[] file_data) { 
     this.file_data = file_data; 
    } 


    public static long getSerialversionuid() { 
     return serialVersionUID; 
    } 

} 

我用FieldBridge ...

public class BlobToString extends StringBridge { 

    @Override 
    public String objectToString(Object object) { 
     try 
     { 
      byte[] byteData = ((String)object).getBytes(); 
      MagicMatch match = Magic.getMagicMatch((byte[])byteData); 
      String mimeType = match.getMimeType(); 
      String extn = match.getExtension(); 

      if(mimeType.equalsIgnoreCase("image/jpeg")) 
      { 

      } 
      else if(mimeType.equalsIgnoreCase("application/pdf")) 
      { 
       COSDocument cd = null; 
       ByteArrayInputStream bais =null; 
       try 
       { 
        bais = new ByteArrayInputStream((byte[])object); 
        PDFParser pdf = new PDFParser(bais); 
        pdf.parse(); 
        cd = pdf.getDocument(); 
        PDFTextStripper stripper = new PDFTextStripper(); 
        String text = stripper.getText(new PDDocument(cd)); 
        cd.close(); 
        bais.close(); 
        return text; 
       } 
       catch(Exception ex) 
       { 
        cd.close(); 
        bais.close(); 
        ex.printStackTrace(); 
       } 

      } 
      else if(mimeType.equalsIgnoreCase("application/rtf") || mimeType.equalsIgnoreCase("text/rtf")) 
      { 
       ByteArrayInputStream bais = new ByteArrayInputStream((byte[])object); 
       RTFEditorKit kit = new RTFEditorKit(); 
       Document doc = kit.createDefaultDocument(); 
       kit.read(bais, doc, 0); 
       bais.close(); 
       return doc.getText(0,doc.getLength()); 
      } 
      else if(mimeType.equalsIgnoreCase("application/msword")) 
      { 
       StringBuilder _result = new StringBuilder(); 
       try { 

        ByteArrayInputStream bais = new ByteArrayInputStream((byte[]) object); 
        WordExtractor extractor = new WordExtractor(bais); 
        String wordText = extractor.getText(); 
        bais.close(); 
        return wordText; 

       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 

      } 
      else if(mimeType.equalsIgnoreCase("application/vnd.ms-excel")) 
      { 
       StringBuilder _result = new StringBuilder(); 
       try { 

        ByteArrayInputStream bais = new ByteArrayInputStream((byte[]) object); 
        WordExtractor extractor = new WordExtractor(bais); 
        String wordText = extractor.getText(); 
        bais.close(); 
        return wordText; 

       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 

      } 
      System.out.println(mimeType); 
      return null; 
     }catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      return ex.getMessage(); 
     } 


    } 
} 
+0

我懷疑你應該禁用這些字段的分析器,但要知道你也應該發佈實體的映射:哪些@Field選項正在使用_file_data_和_fileName_? – Sanne 2013-04-11 09:06:32

+0

您的示例查詢似乎也是錯誤的。例如,初始嵌套的queryBuilder.bool()。然後是.createQuery())。createQuery()。你能否首先更新你的例子你正在使用的實際查詢? – Hardy 2013-04-11 09:32:48

+0

@Sanne:請再次提出我的問題我已發佈實體映射。 – 2013-04-12 04:43:40

回答

4

請給出兩個查詢

Query query1=queryBuilder.keyword(). 
       onField("file_data").ignoreFieldBridge(). 
       matching("HDFC"). 
       createQuery(); 

    Query query2=queryBuilder.keyword(). 
       onField("fileName").ignoreFieldBridge(). 
       matching("abc.pdf"). 
       createQuery(); 

將它們添加到列表中:

listOfQuery.add(query1); 
    listOfQuery.add(query2); 

然後建立一個最終的查詢作爲

Query finalLuceneQuery=new BooleanQuery(); 
    for (Query query : listOfQuery) { 
        finalLuceneQuery.add(query, BooleanClause.Occur.MUST); 
       } 
       fullTextQuery = fullTextSession.createFullTextQuery(finalLuceneQuery, <Youclass>.class); 

這會爲你工作。

+0

這是工作非常感謝... !!! 我還有一個問題.. 我已經創建了類似於......的查詢,它們是:..查詢構建器。關鍵字()。 onField(「fileName」)。ignoreFieldBridge()。 匹配(「abc.pdf」)。 createQuery();' 當我在盧克檢查這個查詢..然後abc和pdf分別搜索。我想搜索整個字!怎麼做? – 2013-04-16 06:59:06

+0

如果這解決您的問題接受答案,並嘗試使用ignoreAnalyzer()... – 2013-04-16 09:09:14

+0

謝謝你的答案,它可以幫助我。 – 2015-05-10 13:42:04