Я использую 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> {}