Spring boot集成Elastic-search并添加中文分词器

发布时间:2019-08-18 14:48:21阅读:(649)

1. 在pom中添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2. 新建Elastic Search索引配置文件

es_setting.json

{
"index": {
"analysis": {
"analyzer": {
"ik_pinyin_analyzer": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": "pinyin_filter"
}
},
"filter": {
"pinyin_filter": {
"type": "pinyin",
"keep_first_letter":false,
"keep_separate_first_letter": false,
"keep_full_pinyin": true,
"keep_original": false,
"limit_first_letter_length": 10,
"lowercase": true,
"remove_duplicated_term": true,
"keep_none_chinese": false
}
}
}
}
}

建文件放在/resources/es文件夹下

这里我们同时配置了ik分词器和pinyin分词器

3.新建实体

@Document(indexName = "blog", type = "article") // 配置索引
@Setting(settingPath = "es/es_setting.json") // 使用自定义的配置文件
public class ArticleES {
@Id
@Field(store = true, index = false, type = FieldType.Long)
private Long id;
// 文章标题
@Field(analyzer = "ik_pinyin_analyzer", store = true, searchAnalyzer = "ik_pinyin_analyzer", type = FieldType.Text) // 使用我们自定义的分词器
private String title;
// 文章内容
@Field(analyzer = "ik_pinyin_analyzer", store = true, searchAnalyzer = "ik_pinyin_analyzer", type = FieldType.Text)
private String content;

// 省略get,set
}

4.新建一个Repository

@Repository
public interface ArticleRepository extends ElasticsearchCrudRepository<ArticleES, Long> {
}

这里使用spring-data-elasticssearch下的ElasticsearchCrudRepository,已经包含了Crud方法

5.增删改查

articleRepository.save(new ArticleES());
articleRepository.findAllById(1);
articleRepository.findAll();
articleRepository.deleteById(1);
// 这里都是jpa的一些基础用法

6.高级查询

在查询的时候,我们往往需要多字段设置权重,这样jpa默认的查询方法就不适用了,比如我们查询文章,希望文章标题的权重高一些,这里我们使用ElasticsearchTemplate来自定义查询

@Autowired
private ElasticsearchTemplate elasticsearchTemplate;

// 根据关键词查找文章,带分页
public List<ArticleListBO> searchPages(String key, Integer pageNum, Integer pageSize){
HighlightBuilder.Field title = new HighlightBuilder.Field("title") // 设置关键字高亮
.preTags(Constants.HIGHLIGHT_PREFIX)
.postTags(Constants.HIGHLIGHT_SUFFIX);
HighlightBuilder.Field content = new HighlightBuilder.Field("content")
.preTags(Constants.HIGHLIGHT_PREFIX)
.postTags(Constants.HIGHLIGHT_SUFFIX);
HighlightBuilder.Field[] fields = {title, content};
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(key) // 设置不同字段的权重
.field("title", 3.0f)
.field("content", 1.0f);
SortBuilder sortBuilder = new ScoreSortBuilder().order(SortOrder.DESC); // 设置排序顺序
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.withHighlightFields(fields)
.withSort(sortBuilder)
.withPageable(PageRequest.of(pageNum, pageSize)) // 设置分页
.withMinScore(0.05F) // 设置最低匹配分值
.build();
AggregatedPage<ArticleES> page = elasticsearchTemplate.queryForPage(searchQuery, ArticleES.class, esResultMapper);
List<ArticleES> list = page.getContent();
return list;
}

至此,我们就完成了简单的Elastic search整合

上一篇:

下一篇:Activiti清库脚本

发表评论

评论列表(有0条评论649人围观)
暂无评论