Raj*_*war 3 lucene hibernate-search
我正在使用 Hibernate lucene 进行搜索。现在我想搜索具有多对一关系的实体
我有两个类,一个是catalogueBase,另一个是Subject,这里的主题具有多对一关系(它是单向关系)
CatalogueBase.java 类:
@Indexed
@JsonAutoDetect
@Entity
@Table(name="catalogueBase")
public class CatalogueBase extends BaseObject implements Serializable {
// some entities
// ...
private Subject subject;
// setter and get methods
// ...
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES)
@ManyToOne
@NotFound(action= NotFoundAction.IGNORE)
@JoinColumn(name = "subject1", insertable = true, updatable=true, nullable = true)
@JsonProperty
public Subject getSubject() {
return subject;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
}
Run Code Online (Sandbox Code Playgroud)
subject.java(我想要搜索的有关主题的内容将存储在描述列中):
@Indexed
@JsonAutoDetect
@Entity
@Table(name="subject")
public class Subject implements java.io.Serializable {
private String description;
// ...
@Column(name = "subjectname", nullable = false, length = 150)
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
// ....
}
Run Code Online (Sandbox Code Playgroud)
这是我的 DAO 方法:
private List<CatalogueBase> searchTitle(String queryString) throws InterruptedException {
Session session = getSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
org.hibernate.Query fullTextQuery = null;
List<CatalogueBase> resultList = null;
try{
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(CatalogueBase.class).get();
org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword().onFields("title","subject").matching(queryString).createQuery();
fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, CatalogueBase.class);
List<CatalogueBase> contactList = fullTextQuery.list();
resultList = new ArrayList<CatalogueBase>();;
for (CatalogueBase catalogueBase : contactList) {
catalogueBase.setNoOfCopiesBooks(getCopydetailsCount(catalogueBase.getId()));
catalogueBase.setIssuedCount(getIssuedCount(catalogueBase.getId()));
resultList.add(catalogueBase);
}
} catch(Exception e) {
e.printStackTrace();
}
return resultList;
}
Run Code Online (Sandbox Code Playgroud)
但它给出了一个错误,例如:SearchException: Unable to find field subject in com.easylib.elibrary.model.CatalogueBase
我做了类似这篇文章的事情,但错误是一样的。
我得到了解决方案。
我只会发布代码...
@Indexed // must
@JsonAutoDetect
@Entity
@Table(name="subject")
public class Subject implements java.io.Serializable {
private String description;
@ContainedIn // must
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES)
@Column(name = "subjectname", nullable = false, length = 150)
public String getDescription() {
return this.description;
}
}
Run Code Online (Sandbox Code Playgroud)
在目录中:
@ManyToOne
@NotFound(action= NotFoundAction.IGNORE)
@JoinColumn(name = "subject1", insertable = true, updatable=true, nullable = true)
@JsonProperty
@IndexedEmbedded // must
public Subject getSubject() {
return subject;
}
public void setSubject(Subject subject) {
this.subject = subject;
}
Run Code Online (Sandbox Code Playgroud)
而在 DAO 中,它必须是:
org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword().onFields("subject.description").matching(queryString).createQuery();
Run Code Online (Sandbox Code Playgroud)