Индексирование в Hibernate Search не работает должным образом - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь интегрировать Hibernate Search в свой бэкэнд, но не могу заставить его работать так, как мне бы хотелось.

Мое намерение - получить все следующие model.Course кортежи только с токеном "java":

enter image description here My model.Course table

В настоящее время я получаю 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, ...) {
    /*...*/
}

ВАЖНОЕ РЕДАКТИРОВАНИЕ: Сначала я думал, что это проблема с запросом, но на самом деле это проблема индексации.

Here's a screenshot of my index's state (using Luke)

Я не знаю, как решить проблему такого типа. Я слышу предложения. Детали:

  • Я использую синглтон для SessionFactory (я не был до редактирования)
  • Я использую org.hibernate:hibernate-search-orm:5.8.2.Final
  • Я использую HSQLdb 2.4.0
  • Остальная часть hibernate работает отлично (операции CRUD)

1 Ответ

0 голосов
/ 04 мая 2018

Это похоже на проблему анализа, например, выбранный анализатор не разделяет поле в токенах.

Что немного странно, так это то, что анализатор по умолчанию (StandardAnalyzer) разделяет поле на токены, поэтому оно должно работать "из коробки".

Вы установили другой анализатор по умолчанию (например, KeywordAnalyzer)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...