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