demo系列-搜索引擎-Elasticsearch
文章目录
1. Windows安装部署
1.1 下载
https://www.elastic.co/cn/downloads/elasticsearch
1.2 启动
elasticsearch.bat
1.3 访问127.0.0.1:9200
1.4 [可选]elasticsearch-head插件
2. Spring Boot集成Elasticsearch
2.1 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.2 配置
spring.elasticsearch.rest.uris=http://127.0.0.1:9200
#spring.elasticsearch.rest.username=elastic
#spring.elasticsearch.rest.password=1234567
2.3 Document
@Field的type,Text和Keyword的区别:Text会分词,Keyword整词匹配
时间类型,@Field配置的是mapping格式,所以序列化后的格式要匹配,建议使用@JsonFormat注解+jackson的ObjectMapper进行序列化
@Data
@Document(indexName = "record", shards = 1, replicas = 1)
public class Record {
@Id
private Integer id;
@Field(type = FieldType.Text)
private String title;
@Field(type = FieldType.Text)
private String type;
@Field(type = FieldType.Text)
private String content;
@Field(name = "create_time", type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM:dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime createTime;
}
2.4 repository+service
@Repository
public interface RecordRepository extends ElasticsearchRepository<Record, Integer> {
}
@Service
public class RecordService {
@Autowired
RecordRepository recordRepository;
public void save(Record record) {
recordRepository.save(record);
}
public void remove(Integer id) {
recordRepository.deleteById(id);
}
}
2.5 ES#创建索引和搜索
创建索引
@Autowired
ElasticsearchRestTemplate elasticsearchRestTemplate;
@PostConstruct
void init() {
createIndex(Record.class);
}
public void createIndex(Class<?> clazz) {
/**
* 1. 指定document
* 2. 创建索引
* 3. 创建字段映射
* 4. 索引指定字段映射
*/
IndexOperations indexOps = elasticsearchRestTemplate.indexOps(clazz);
if (indexOps.exists()) {
return;
}
indexOps.create();
Document mapping = indexOps.createMapping();
indexOps.putMapping(mapping);
}
搜索
public List<Record> searchRecord(String keyword) {
/**
* 组合查询: BoolQueryBuilder
* must and
* mustNot not
* should or
*/
FuzzyQueryBuilder titleFuzzyQueryBuilder = QueryBuilders.fuzzyQuery("title", keyword);
FuzzyQueryBuilder typeFuzzyQueryBuilder = QueryBuilders.fuzzyQuery("type", keyword);
FuzzyQueryBuilder contentFuzzyQueryBuilder = QueryBuilders.fuzzyQuery("content", keyword);
BoolQueryBuilder builder = QueryBuilders.boolQuery();
builder.should(titleFuzzyQueryBuilder)
.should(typeFuzzyQueryBuilder)
.should(contentFuzzyQueryBuilder);
FieldSortBuilder createTimeSortBuilder = SortBuilders.fieldSort("create_time")
.order(SortOrder.DESC);
PageRequest pageRequest = PageRequest.of(0, 10);
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(builder)
.withSort(createTimeSortBuilder)
.withPageable(pageRequest)
.build();
SearchHits<Record> search = elasticsearchRestTemplate.search(query, Record.class);
List<Record> records = search.stream().map(SearchHit::getContent).collect(Collectors.toList());
return records;
}
demo流程:
定时任务生产消息到RocketMQ
消费者将消息save到ES
REST提供搜索功能,根据keyword查询