Я пытаюсь интегрировать Hibernate Search в свой бэкэнд, но не могу заставить его работать так, как мне бы хотелось.
Мое намерение - получить все следующие model.Course
кортежи только с токеном "java":
В настоящее время я получаю model.Course
только с id
= 26. Это означает, что Lucene работает, но я не знаю, как создать запрос, необходимый для выполнения операции, которую я хочу.
Это мой CourseService
код:
private Session session;
private FullTextSession fts;
public CourseService(){
SessionFactory sf = SessionFactoryManager.getInstance(); // Singleton
this.session = sf.openSession();
this.fts = Search.getFullTextSession(this.session);
}
public List<Course> searchCourses(String token) {
try {
this.fts.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
Transaction tx = this.fts.beginTransaction();
QueryBuilder queryBuilder = this.fts.getSearchFactory()
.buildQueryBuilder()
.forEntity(Course.class)
.get();
org.apache.lucene.search.Query query = queryBuilder.simpleQueryString()
.onField("description").andField("name")
.matching(token)
.createQuery();
org.hibernate.query.Query hibQuery = fts.createFullTextQuery(query, Course.class);
List result = hibQuery.getResultList();
tx.commit();
return result;
}
Это мой model.Course
код:
@Entity
@Indexed
@Inheritance(strategy = InheritanceType.JOINED)
public class Course implements Comparable<Course>{
@Id
@DocumentId
@GeneratedValue(strategy= GenerationType.AUTO)
private int id;
@Field (termVector = TermVector.YES)
private String name;
@Field
private String description;
/*...*/
protected Course(String name, String description, ...) {
/*...*/
}
ВАЖНОЕ РЕДАКТИРОВАНИЕ: Сначала я думал, что это проблема с запросом, но на самом деле это проблема индексации.
Я не знаю, как решить проблему такого типа. Я слышу предложения. Детали:
- Я использую синглтон для
SessionFactory
(я не был до редактирования)
- Я использую
org.hibernate:hibernate-search-orm:5.8.2.Final
- Я использую HSQLdb 2.4.0
- Остальная часть hibernate работает отлично (операции CRUD)