HIbernate Search 不返回主键的搜索结果
HIbernate Search not returning search results on primary key
我正在使用 HIbernate 搜索 (5.8.2)。除主键外,搜索在每个字段上都能顺利进行。当我向它传递任何内容时,它 returns 是一个空列表。我遵循了 hibernate 文档,使用 @documentId 注释作为主键。我错过了什么?
这是我的模型:
@SuppressWarnings("serial")
@Entity
@Indexed
@Table(name = "MAIN",schema="maindb")
public class MAIN implements Serializable {
@Id
@DocumentId
private String poNo; // my primary key which has values like "PO123"
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String postatus;
我的搜索功能:
public List<?> search(String poNumber, String status) {
QueryBuilder qb =
fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(MAIN.class).get();
BooleanQuery.Builder finalLuceneQuery = new BooleanQuery.Builder();
org.hibernate.query.Query hibQuery =
fullTextSession.createFullTextQuery(finalLuceneQuery.build(),MAIN.class);
org.apache.lucene.search.Query querypono1 =
qb2.simpleQueryString().onField("poNo").matching(poNumber)
.createQuery();
org.apache.lucene.search.Query queryStatus =
qb.simpleQueryString().onField("po01_status")
.matching("postatus").createQuery();
finalLuceneQuery.add(querypono1, BooleanClause.Occur.MUST);
finalLuceneQuery.add(queryStatus , BooleanClause.Occur.MUST);
hibQuery.setFirstResult(0);
List<?> resultArchive = new ArrayList<String>();
try {
result = hibQuery.getResultList();
} catch (Exception e) {
e.printStackTrace();
// log.log(ERROR, "ERROR FETCHING RESULT LIST FROM DATABASE");
}
return result;
}
问题是简单查询字符串解析器将 "PO123" 转换为 "po123"。我想知道为什么,我必须检查一下,这可能是一个错误,或者至少是一个意外的行为。
也就是说,您不应该使用 simpleQuery() 入口点进行精确匹配。
替换:
org.apache.lucene.search.Query querypono1 = qb2.simpleQueryString().onField("poNo").matching(poNumber).createQuery();
作者:
org.apache.lucene.search.Query querypono1 = qb2.keyword().onField("poNo").matching(poNumber).createQuery();
(关键字()而不是 simpleQueryString())
我会跟进这个问题,因为这不是我所期望的行为。感谢提出。
-> JIRA issue: https://hibernate.atlassian.net/browse/HSEARCH-3039 , 将包含在即将发布的 5.10.0.Final.
我正在使用 HIbernate 搜索 (5.8.2)。除主键外,搜索在每个字段上都能顺利进行。当我向它传递任何内容时,它 returns 是一个空列表。我遵循了 hibernate 文档,使用 @documentId 注释作为主键。我错过了什么?
这是我的模型:
@SuppressWarnings("serial")
@Entity
@Indexed
@Table(name = "MAIN",schema="maindb")
public class MAIN implements Serializable {
@Id
@DocumentId
private String poNo; // my primary key which has values like "PO123"
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String postatus;
我的搜索功能:
public List<?> search(String poNumber, String status) {
QueryBuilder qb =
fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(MAIN.class).get();
BooleanQuery.Builder finalLuceneQuery = new BooleanQuery.Builder();
org.hibernate.query.Query hibQuery =
fullTextSession.createFullTextQuery(finalLuceneQuery.build(),MAIN.class);
org.apache.lucene.search.Query querypono1 =
qb2.simpleQueryString().onField("poNo").matching(poNumber)
.createQuery();
org.apache.lucene.search.Query queryStatus =
qb.simpleQueryString().onField("po01_status")
.matching("postatus").createQuery();
finalLuceneQuery.add(querypono1, BooleanClause.Occur.MUST);
finalLuceneQuery.add(queryStatus , BooleanClause.Occur.MUST);
hibQuery.setFirstResult(0);
List<?> resultArchive = new ArrayList<String>();
try {
result = hibQuery.getResultList();
} catch (Exception e) {
e.printStackTrace();
// log.log(ERROR, "ERROR FETCHING RESULT LIST FROM DATABASE");
}
return result;
}
问题是简单查询字符串解析器将 "PO123" 转换为 "po123"。我想知道为什么,我必须检查一下,这可能是一个错误,或者至少是一个意外的行为。
也就是说,您不应该使用 simpleQuery() 入口点进行精确匹配。
替换:
org.apache.lucene.search.Query querypono1 = qb2.simpleQueryString().onField("poNo").matching(poNumber).createQuery();
作者:
org.apache.lucene.search.Query querypono1 = qb2.keyword().onField("poNo").matching(poNumber).createQuery();
(关键字()而不是 simpleQueryString())
我会跟进这个问题,因为这不是我所期望的行为。感谢提出。
-> JIRA issue: https://hibernate.atlassian.net/browse/HSEARCH-3039 , 将包含在即将发布的 5.10.0.Final.