Hibernate 休眠搜索+;Lucene与运算符查询

Hibernate 休眠搜索+;Lucene与运算符查询,hibernate,hibernate-search,Hibernate,Hibernate Search,我目前正在进行HibernateSearch4.1 我有一个表(文件\数据,文件名) 我想创建一个查询,如 文件数据:XYZ,文件名:abc.pdf 如何执行此查询? 下面我试图对此提出质疑 Query luceQry3 = queryBuilder .bool() .must( queryBuilder

我目前正在进行HibernateSearch4.1

我有一个表(文件\数据,文件名) 我想创建一个查询,如 文件数据: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运算符,以便最小化查询结果

-------我的实体映射如下所示-----

我用过田桥

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();
        }


    }
}
提出两个问题

    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);
queryfinallucenequery=newbooleanquery();
for(查询:listOfQuery){
finalLuceneQuery.add(query,BooleanClause.occurrent.MUST);
}
fullTextQuery=fullTextSession.createFullTextQuery(finalLuceneQuery.class);
这对您很有用。

进行两次查询

    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);
queryfinallucenequery=newbooleanquery();
for(查询:listOfQuery){
finalLuceneQuery.add(query,BooleanClause.occurrent.MUST);
}
fullTextQuery=fullTextSession.createFullTextQuery(finalLuceneQuery.class);

这对您很有用。

我想您应该禁用这些字段的分析器,但要知道您也应该发布实体的映射:哪些@Field选项用于文件\u数据和文件名?您的示例查询似乎也错了。例如,初始嵌套的queryBuilder.bool()。还有.createQuery()).createQuery()。你能先更新你的示例吗?你正在使用的实际查询?@Sanne:请再次回答我的问题我已经发布了实体映射。我想你应该禁用这些字段的分析器,但是要知道你也应该发布实体的映射:哪些@Field选项被用于文件\数据和文件名?你的示例查询似乎也是错误的。例如,初始嵌套的queryBuilder.bool()。还有.createQuery()).createQuery()。你能先更新你的示例吗?你正在使用的实际查询?@Sanne:请再次回答我的问题,我已经发布了实体映射。这很有效,非常感谢。。。!!!我还有一个问题。。我创建了一个类似..的查询<代码>queryBuilder.keyword()。onField(“fileName”).ignoreFieldBridge()。匹配(“abc.pdf”)。createQuery()当我在luke中检查此查询时。。然后abc和pdf分别搜索。我想搜索整个单词!如何做到这一点?这是工作非常感谢。。。!!!我还有一个问题。。我创建了一个类似..的查询<代码>queryBuilder.keyword()。onField(“fileName”).ignoreFieldBridge()。匹配(“abc.pdf”)。createQuery()当我在luke中检查此查询时。。然后abc和pdf分别搜索。我想搜索整个单词!怎么做?