Hibernate Search возвращает устаревшие данные - PullRequest
0 голосов
/ 06 мая 2018

Я использую JPARepository для создания и обновления моих сущностей. Оба с помощью метода save (). Поиск с помощью Hibernate Search работает хорошо, когда я создаю сущность, но когда я обновляю ее, странные вещи начинают происходить.

Обновление распознается в том смысле, что обнаруживаются только обновленные данные, которые на самом деле соответствуют поисковому запросу, но они по-прежнему возвращают объект, содержащий старые данные. При использовании JPA findAll возвращает обновленную версию сущности.

Пример: Apple обновляется с помощью save (), чтобы теперь быть бананом. Теперь я могу искать бананы с помощью спящего поискового запроса, и он находит объект с именем apple.

После перезапуска сервера проблема решена.

В чем может быть моя проблема здесь?

Редактировать код для уточнения:

@Entity
@Indexed
@AnalyzerDef(name = "edgeNgram",
    tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),
    filters = {
        @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class), // Replace accented characeters by their simpler counterpart (è => e, etc.)
        @TokenFilterDef(factory = LowerCaseFilterFactory.class), // Lowercase all characters
        @TokenFilterDef(factory = EdgeNGramFilterFactory.class,
            params = {
                @Parameter(name = "minGramSize", value = "1"),
                @Parameter(name = "maxGramSize", value = "10")
            }
        ) // Generate prefix tokens)
    })
@AnalyzerDef(name = "edgeNGram_query",
    tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),
    filters = {
        @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class), // Replace accented characeters by their simpler counterpart (è => e, etc.)
        @TokenFilterDef(factory = LowerCaseFilterFactory.class) // Lowercase all characters
    })
public class Customer {
    @Column(nullable = false)
    @Size(max = 100)
    @NotNull
    @NotBlank
    @Field(analyzer = @Analyzer(definition = "edgeNgram"))
    private String firstName;
//more class
}

Поиск в спящем режиме

    @Transactional
    public List<Customer> searchCustomerByFirstAndLastNamePhrase(String text){

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);

    Query query = fullTextEntityManager
        .getSearchFactory()
        .buildQueryBuilder()
        .forEntity(Customer.class)
        .overridesForField("firstName", "edgeNGram_query")
        .overridesForField("lastName","edgeNGram_query")
        .get()
        .simpleQueryString()
        .onFields("firstName","lastName")
        .withAndAsDefaultOperator()
        .matching(text)
        .createQuery();

    List<Customer> results = getJpaQuery(query).getResultList();

    return results;
    }

    //step 1
private QueryBuilder getQueryBuilder() {

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);

    return fullTextEntityManager.getSearchFactory()
        .buildQueryBuilder()
        .forEntity(Customer.class)
        .get();
}

//step 3
private FullTextQuery getJpaQuery(org.apache.lucene.search.Query luceneQuery) {

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);

    return fullTextEntityManager.createFullTextQuery(luceneQuery, Customer.class);
}

public void initSearchIndex() {
    entityManager = entityManager.getEntityManagerFactory().createEntityManager();
    FullTextEntityManager fullTextEntityManager
        = Search.getFullTextEntityManager(entityManager);
    try {
        fullTextEntityManager.createIndexer().startAndWait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

JPARep

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long> {}

1 Ответ

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

Я исправил проблему, не создавая самостоятельно менеджера сущностей, как показано ниже.

entityManager = entityManager.getEntityManagerFactory().createEntityManager();

Вместо этого я использую диспетчер сущностей, который подключается автоматически. Этот не полностью создан в конструкторе, и поэтому initSearchIndex () выдает ошибку. Ожидание, пока не поступит первый поисковый запрос, и затем вызов initSearchIndex (), как только он заработает.

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