在Spring中调用ElasticSearch的服务有两种通用的方式:ElasticsearchRepository和ElasticsearchTemplate
ElasticsearchRepository
ElasticsearchRepository是比较简单的一种方式,但是功能有限,
- 定义Document
@Document(indexName = DemoDocument.INDEX, type = DemoDocument.TYPE)
public class DemoDocument {
public static final String INDEX = "demo";
public static final String TYPE = "content";
@Id
private String id;
@Field(type = FieldType.Date)
private Date publishTime;
@Field(type = FieldType.keyword)
private String authorId;
@Field(type = FieldType.text)
private String authorNickName;
@Field(type = FieldType.text)
private String authorAvatar;
@Field(type = FieldType.keyword)
private String referenceType;
@Field(type = FieldType.text)
private String referenceId;
@Field(type = FieldType.keyword)
private List<String> tags;
@Field(type = FieldType.keyword)
private List<String> channels;
@Field(type = FieldType.text, searchAnalyzer = "standard", analyzer = "standard")
private String title;
@Field(type = FieldType.text, searchAnalyzer = "standard", analyzer = "standard")
private String absContent;
@Field(type = FieldType.text, searchAnalyzer = "standard", analyzer = "standard")
private String content;
@Field(type = FieldType.Integer)
private int coverCount;
@Field(type = FieldType.text)
private List<String> coverImageList;
@Field(type = FieldType.keyword)
private String sortValue;
}
- 定义Repository
@Repository
public interface DemoContentRepository extends ElasticsearchRepository<DemoContentDocument, String> {
}
- 调用新增和删除
DemoContentDocument document = new DemoContentDocument();
document.setId(id);
.....
//修改和增加都是直接save
contentRepository.save(document);
//删除
if (contentRepository.existsById(id)) {
contentRepository.deleteById(id);
}
ElasticsearchTemplate
- 按ID查询
Optional<DemoContentDocument> optionalDocument = demoContentRepository.findById(id);
if (!Optional.empty().equals(optionalDocument)) {
document = optionalDocument.get();
}
- 字段=和in条件查询
Criteria criteria = new Criteria("referenceType").is(referenceType);
criteria.and(new Criteria("referenceId").in(refIdList));
CriteriaQuery criteriaQuery = new CriteriaQuery(criteria) ;
List<DemoContentDocument> contentDocumentList = elasticsearchTemplate.queryForList(criteriaQuery, DemoContentDocument.class);
- 分页和orderBy查询
Criteria criteria = new Criteria("authorId").is(authorId);
CriteriaQuery criteriaQuery = new CriteriaQuery(criteria)
.setPageable(new PageRequest(pageNum, pageSize))
.addSort(new Sort(Sort.Direction.DESC, "sortValue"));
Page<DemoContentDocument> contentDocumentPage = elasticsearchTemplate.queryForPage(criteriaQuery, DemoContentDocument.class);
- 按权重模糊搜索
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//搜索关键字
if(StringUtils.isNotEmpty(keyWords)){
MultiMatchQueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyWords);
//数字越大,权重越大
queryBuilder.field("absContent",1);
queryBuilder.field("content",2);
queryBuilder.field("title",7);
boolQueryBuilder.must(queryBuilder);
}
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withPageable(new PageRequest(pageNum, pageSize)).build();
Page<DemoContentDocument> contentDocumentPage = elasticsearchTemplate.queryForPage(searchQuery, DemoContentDocument.class);
- Sort字段
Criteria criteria = new Criteria("referenceType").in(referenceType);
CriteriaQuery criteriaQuery = new CriteriaQuery(criteria)
.setPageable(new PageRequest(0, pageSize))
.addSort(new Sort(Sort.Direction.DESC, "sortValue"));
resultList = elasticsearchTemplate.queryForList(criteriaQuery, DemoContentDocument.class);