1.pom文件
<!-- hibernate search-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>5.11.1.Final</version>
<exclusions>
<exclusion>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging-processor</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--中文分词器-->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-smartcn</artifactId>
<version>5.5.5</version>
</dependency>
</dependencies>
2.实体类注解
@Indexed:指定索引名称。
@Analyzer(impl = SmartChineseAnalyzer.class):指定具体的Analyzer实现类
@Field:指定当前属性在Lucene Document中存储的名称,默认为属性名。在想要按照某字段检索时,就在字段上加上。我这里只需要keywords
@Indexed
@Analyzer(impl = SmartChineseAnalyzer.class)
@Entity
@Table(name = "demand")
@Data
@ToString
@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})
public class Demand extends IdEntity {
//会员id'
private Long memberId;
//编号
private String no;
//名称
private String name;
//关键字
@Field
private String keywords;
//描述
@Column(columnDefinition="TEXT")
private String describes;
//类型
private Integer type;
}
3.在service中初始化索引
@Autowired
private EntityManager entityManager;
/**
* 初始化索引
*/
@Transactional
@Override
public void initializeHibernateSearch() {
try {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public List<Achievement> searchAchievement(String keywords) {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Achievement.class).get();
//在onFields中传入实体类注解@Field的字段,如onFields("keywords","name")
Query luceneQuery = queryBuilder.keyword().onFields("keywords").matching(keywords).createQuery();
FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Achievement.class);
return fullTextQuery.getResultList();
}
4.在controller调用
private List<Achievement> search(HttpServletRequest request, String keywords) {
return fAchievementServicesearchAchievement(keywords);
}