Skip to content

Commit f7cd5a4

Browse files
committed
[HSEARCH] hsearch-elasticsearch-wikipedia: Upgrade to Hibernate Search 6
1 parent dfd7923 commit f7cd5a4

File tree

7 files changed

+86
-112
lines changed

7 files changed

+86
-112
lines changed

hibernate-search/hsearch-elasticsearch-wikipedia/pom.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
<mapstruct.version>1.1.0.Final</mapstruct.version>
2626
<apt.version>1.1.3</apt.version>
2727
<!-- Override the version of Hibernate ORM in Spring Boot -->
28-
<hibernate.version>5.4.0.Final</hibernate.version>
29-
<hibernate.search.version>5.11.0.Final</hibernate.search.version>
28+
<hibernate.version>5.4.1.Final</hibernate.version>
29+
<hibernate.search.version>6.0.0.Alpha2</hibernate.search.version>
3030
</properties>
3131

3232
<dependencies>
@@ -61,13 +61,13 @@
6161
<artifactId>HikariCP</artifactId>
6262
</dependency>
6363
<dependency>
64-
<groupId>org.hibernate</groupId>
65-
<artifactId>hibernate-search-orm</artifactId>
64+
<groupId>org.hibernate.search</groupId>
65+
<artifactId>hibernate-search-mapper-orm</artifactId>
6666
<version>${hibernate.search.version}</version>
6767
</dependency>
6868
<dependency>
69-
<groupId>org.hibernate</groupId>
70-
<artifactId>hibernate-search-elasticsearch</artifactId>
69+
<groupId>org.hibernate.search</groupId>
70+
<artifactId>hibernate-search-backend-elasticsearch</artifactId>
7171
<version>${hibernate.search.version}</version>
7272
</dependency>
7373
</dependencies>

hibernate-search/hsearch-elasticsearch-wikipedia/src/main/java/org/hibernate/search/demos/wikipedia/data/Page.java

Lines changed: 11 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -8,53 +8,15 @@
88
import javax.persistence.ManyToOne;
99
import javax.persistence.SequenceGenerator;
1010

11-
import org.apache.lucene.analysis.charfilter.HTMLStripCharFilterFactory;
12-
import org.apache.lucene.analysis.core.LowerCaseFilterFactory;
13-
import org.apache.lucene.analysis.core.StopFilterFactory;
14-
import org.apache.lucene.analysis.core.WhitespaceTokenizerFactory;
15-
import org.apache.lucene.analysis.en.PorterStemFilterFactory;
16-
import org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilterFactory;
1711
import org.hibernate.annotations.Type;
18-
import org.hibernate.search.annotations.Analyzer;
19-
import org.hibernate.search.annotations.AnalyzerDef;
20-
import org.hibernate.search.annotations.CharFilterDef;
21-
import org.hibernate.search.annotations.Field;
22-
import org.hibernate.search.annotations.Indexed;
23-
import org.hibernate.search.annotations.IndexedEmbedded;
24-
import org.hibernate.search.annotations.TokenFilterDef;
25-
import org.hibernate.search.annotations.TokenizerDef;
12+
import org.hibernate.search.mapper.pojo.dirtiness.ReindexOnUpdate;
13+
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
14+
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
15+
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded;
16+
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexingDependency;
2617

2718
@Entity
2819
@Indexed(index = "page")
29-
/*
30-
* Note: analyzer definitions are globally available,
31-
* you don't need to repeat them for each single entity.
32-
*/
33-
@AnalyzerDef(
34-
name = "cleaned_text",
35-
charFilters = {
36-
@CharFilterDef(
37-
factory = HTMLStripCharFilterFactory.class
38-
)
39-
},
40-
tokenizer = @TokenizerDef(
41-
factory = WhitespaceTokenizerFactory.class
42-
),
43-
filters = {
44-
@TokenFilterDef(
45-
factory = ASCIIFoldingFilterFactory.class
46-
),
47-
@TokenFilterDef(
48-
factory = LowerCaseFilterFactory.class
49-
),
50-
@TokenFilterDef(
51-
factory = StopFilterFactory.class
52-
),
53-
@TokenFilterDef(
54-
factory = PorterStemFilterFactory.class
55-
)
56-
}
57-
)
5820
public class Page {
5921

6022
@Id
@@ -63,16 +25,19 @@ public class Page {
6325
private Long id;
6426

6527
@Basic(optional = false)
66-
@Field(analyzer = @Analyzer(definition = "cleaned_text"))
28+
@FullTextField(analyzer = "cleaned_text")
6729
private String title;
6830

6931
@Basic(optional = false)
7032
@Type(type = "text")
71-
@Field(analyzer = @Analyzer(definition = "cleaned_text"))
33+
@FullTextField(analyzer = "cleaned_text")
7234
private String content;
7335

7436
@ManyToOne
75-
@IndexedEmbedded
37+
@IndexedEmbedded(includePaths = "username")
38+
// Each user may have contributed to a lot of pages - do not reindex pages automatically when a user changes his info
39+
// This will work fine because the info we're relying on here is effectively immutable
40+
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.NO)
7641
private User lastContributor;
7742

7843
public Long getId() {

hibernate-search/hsearch-elasticsearch-wikipedia/src/main/java/org/hibernate/search/demos/wikipedia/data/User.java

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,13 @@
88
import javax.persistence.SequenceGenerator;
99
import javax.persistence.Table;
1010

11-
import org.apache.lucene.analysis.core.KeywordTokenizerFactory;
12-
import org.apache.lucene.analysis.core.LowerCaseFilterFactory;
13-
import org.apache.lucene.analysis.miscellaneous.ASCIIFoldingFilterFactory;
14-
import org.hibernate.search.annotations.Analyzer;
15-
import org.hibernate.search.annotations.AnalyzerDef;
16-
import org.hibernate.search.annotations.Field;
17-
import org.hibernate.search.annotations.Indexed;
18-
import org.hibernate.search.annotations.TokenFilterDef;
19-
import org.hibernate.search.annotations.TokenizerDef;
11+
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
12+
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
13+
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField;
2014

2115
@Entity
2216
@Table(name = "user_") // "user" is an SQL keyword
2317
@Indexed(index = "user")
24-
@AnalyzerDef(
25-
name = "cleaned_keyword",
26-
tokenizer = @TokenizerDef(
27-
factory = KeywordTokenizerFactory.class
28-
),
29-
filters = {
30-
@TokenFilterDef(
31-
factory = ASCIIFoldingFilterFactory.class
32-
),
33-
@TokenFilterDef(
34-
factory = LowerCaseFilterFactory.class
35-
)
36-
}
37-
)
3818
public class User {
3919

4020
@Id
@@ -43,7 +23,7 @@ public class User {
4323
private Long id;
4424

4525
@Basic(optional = false)
46-
@Field(analyzer = @Analyzer(definition = "cleaned_keyword"))
26+
@KeywordField(normalizer = "cleaned_keyword")
4727
private String username;
4828

4929
public Long getId() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Hibernate Search, full-text search for your domain model
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
package org.hibernate.search.demos.wikipedia.data.config;
8+
9+
import org.hibernate.search.backend.elasticsearch.analysis.ElasticsearchAnalysisConfigurer;
10+
import org.hibernate.search.backend.elasticsearch.analysis.model.dsl.ElasticsearchAnalysisDefinitionContainerContext;
11+
12+
import org.springframework.stereotype.Component;
13+
14+
@Component("analysisConfigurerSpringBean")
15+
public class HsearchElasticsearchWikipediaAnalysisConfigurer implements ElasticsearchAnalysisConfigurer {
16+
@Override
17+
public void configure(ElasticsearchAnalysisDefinitionContainerContext context) {
18+
context.analyzer( "cleaned_text" ).custom()
19+
.withTokenizer( "whitespace" )
20+
.withCharFilters( "html_strip" )
21+
.withTokenFilters( "asciifolding", "lowercase", "stop", "porter_stem" );
22+
23+
context.normalizer( "cleaned_keyword" ).custom()
24+
.withTokenFilters( "asciifolding", "lowercase" );
25+
}
26+
}

hibernate-search/hsearch-elasticsearch-wikipedia/src/main/java/org/hibernate/search/demos/wikipedia/data/dao/hibernate/HibernatePageDaoImpl.java

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package org.hibernate.search.demos.wikipedia.data.dao.hibernate;
22

3-
import org.apache.lucene.search.Query;
4-
import org.apache.lucene.search.Sort;
53
import org.hibernate.search.demos.wikipedia.data.Page;
64
import org.hibernate.search.demos.wikipedia.data.dao.PageDao;
75
import org.hibernate.search.demos.wikipedia.util.SearchResult;
8-
import org.hibernate.search.jpa.FullTextEntityManager;
9-
import org.hibernate.search.jpa.FullTextQuery;
10-
import org.hibernate.search.jpa.Search;
11-
import org.hibernate.search.query.dsl.QueryBuilder;
6+
import org.hibernate.search.mapper.orm.Search;
7+
import org.hibernate.search.mapper.orm.jpa.FullTextEntityManager;
8+
import org.hibernate.search.mapper.orm.jpa.FullTextQuery;
9+
1210
import org.springframework.stereotype.Repository;
1311

1412

@@ -39,28 +37,27 @@ public Page getById(Long id) {
3937
@SuppressWarnings("unchecked")
4038
public SearchResult<Page> search(String term, int offset, int limit) {
4139
FullTextEntityManager fullTextEm = Search.getFullTextEntityManager( getEm() );
42-
QueryBuilder queryBuilder = fullTextEm.getSearchFactory().buildQueryBuilder()
43-
.forEntity( Page.class ).get();
4440

45-
Query luceneQuery;
46-
if ( term == null || term.isEmpty() ) {
47-
luceneQuery = queryBuilder.all().createQuery();
48-
}
49-
else {
50-
luceneQuery = queryBuilder.keyword()
51-
.onField( "title" ).boostedTo( 2.0f )
52-
.andField( "content" )
53-
.matching( term )
54-
.createQuery();
55-
}
56-
57-
Sort scoreSort = queryBuilder.sort().byScore().createSort();
41+
FullTextQuery query = fullTextEm.search( Page.class ).query()
42+
.asEntity()
43+
.predicate( f -> {
44+
if ( term == null || term.isEmpty() ) {
45+
return f.matchAll().toPredicate();
46+
}
47+
else {
48+
return f.match()
49+
.onField( "title" ).boostedTo( 2.0f )
50+
.orField( "content" )
51+
.matching( term )
52+
.toPredicate();
53+
}
54+
} )
55+
.sort( f -> f.byScore() )
56+
.build();
57+
58+
query.setFirstResult( offset )
59+
.setMaxResults( limit );
5860

59-
FullTextQuery query = fullTextEm.createFullTextQuery( luceneQuery, Page.class )
60-
.setFirstResult( offset )
61-
.setMaxResults( limit )
62-
.setSort( scoreSort );
63-
6461
return new SearchResult<>( query.getResultSize(), query.getResultList() );
6562
}
6663

hibernate-search/hsearch-elasticsearch-wikipedia/src/main/java/org/hibernate/search/demos/wikipedia/endpoint/AdminEndpoint.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
import javax.ws.rs.core.Response;
99

1010
import org.hibernate.CacheMode;
11-
import org.hibernate.search.MassIndexer;
1211
import org.hibernate.search.demos.wikipedia.data.Page;
1312
import org.hibernate.search.demos.wikipedia.data.User;
14-
import org.hibernate.search.jpa.FullTextEntityManager;
15-
import org.hibernate.search.jpa.Search;
13+
import org.hibernate.search.mapper.orm.Search;
14+
import org.hibernate.search.mapper.orm.jpa.FullTextEntityManager;
15+
import org.hibernate.search.mapper.orm.massindexing.MassIndexer;
16+
1617
import org.springframework.stereotype.Service;
1718
import org.springframework.transaction.annotation.Transactional;
1819

hibernate-search/hsearch-elasticsearch-wikipedia/src/main/resources/application.yaml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@ spring.jpa.properties:
1717
hibernate:
1818
dialect: org.hibernate.dialect.PostgreSQL95Dialect
1919
hibernate.search:
20-
default:
21-
indexmanager: elasticsearch
22-
elasticsearch:
23-
index_schema_management_strategy: create
24-
refresh_after_write: true
25-
required_index_status: yellow
20+
default_backend: elasticsearch1
21+
backends:
22+
elasticsearch1:
23+
type: elasticsearch
24+
host: http://localhost:9200
2625
discovery.enabled: true
26+
analysis_configurer: analysisConfigurerSpringBean
27+
index_defaults:
28+
lifecycle.strategy: create
29+
lifecycle.required_status: yellow
30+
refresh_after_write: true
2731

2832
spring.jackson:
2933
serialization:
@@ -33,5 +37,6 @@ spring.jackson:
3337
logging.level:
3438
# Uncomment for extensive SQL logging
3539
#org.hibernate.SQL: DEBUG
36-
org.hibernate.search.batchindexing: INFO
40+
org.hibernate.search.massindexing: INFO
3741
org.hibernate.search.fulltext_query: DEBUG
42+
#org.hibernate.search.elasticsearch.request: DEBUG

0 commit comments

Comments
 (0)