2013-04-10 2 views
0

я в настоящее время проходит через Hibernate Search 4.1Hibernate Search + Lucene и оператор запроса

У меня есть одна таблица (file_data, Filename) Я хочу создать один запрос, как file_data: XYZ и FileName: 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 Mapping приводится ниже -----

@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

+0

Ваш пример запроса кажется неправильным. Например, начальный вложенный запросBuilder.bool(). И тогда есть .createQuery()). CreateQuery(). Можете ли вы сначала обновить свой пример, когда вы используете фактический запрос? – Hardy

+0

@Sanne: Возьмите на мой вопрос снова Я разместил отображение сущности. –

ответ

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

Это работает Спасибо большое ... !!! У меня есть еще один вопрос .. Я создал запрос типа .. 'queryBuilder.keyword(). onField ("fileName"). IgnoreFieldBridge(). сопоставление ("abc.pdf"). createQuery(); ' Когда я проверил этот запрос в luke .., то abc и pdf искали отдельно. Я хочу искать целые слова! Как это сделать? –

+0

Если это решит вашу проблему, примите ответ и попробуйте использовать ignoreAnalyzer() ... –

+0

спасибо за ответ, это помогает мне. –