1.导入spring-data-elasticsearch依赖
注意:依赖的版本与Elasticsearch版本一致,并且springBoot的版本一致
这里使用的springboot为2.4,elasticsearch依赖为7.9.3,elasticsearch也为7.9.3
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0p64pZ5-1644290370095)(D:笔记Elasticsearch7.6 + SpringBoot1644285206.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HeP51Ix0-1644290370096)(D:笔记Elasticsearch7.6 + SpringBoot1644284886.png)]
#elasticsearch配置#配置es(配置es的地址)spring.elasticsearch.rest.uris=192.168.1.100:9200
配置文件
@Configurationpublic class EsConfig { //指向es地址 @Value("${spring.elasticsearch.rest.uris}") private String edUrl; @Bean RestHighLevelClient client() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(edUrl) .build(); return RestClients.create(clientConfiguration).rest(); }}
3.实体类准备@Data@document(indexName = "user")//索引名称 建议与实体类一致public class User { @Id private Integer id; @Field(type = FieldType.Auto)//自动检测类型 private Integer age; @Field(type = FieldType.Keyword)//手动设置为keyword 但同时也就不能分词 private String name; @Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_max_word")//设置为text 可以分词 private String info;}
4.Elasticsearch Service准备ElasticsearchRepository<,>第一个就是所准备的实体类,第二个是id的类型
public interface EsUserService extends ElasticsearchRepository
继承完这个会提供最基本的增删改查方法,也可以自己定义一些,自己定义的方法命名需要符合规则,并不需要自己去实现
简单查询elasticsearchTemplate需要采用ElasticsearchRestTemplate
简单的查询可以通过Elasticsearch Service来进行查询
@RestControllerpublic class EsController { @Autowired private ElasticsearchRestTemplate elasticsearchTemplate; @Autowired private EsUserService esUserService;//存数据 @GetMapping("saveUser") public ResultVO saveUser(){ //添加索引mapping 索引会自动创建但mapping自只用默认的这会导致分词器不生效 所以这里我们手动导入mapping elasticsearchTemplate.putMapping(User.class); Random random = new Random(); List
复杂的查询可以通过ElasticsearchRestTemplate来实现
//查询高亮显示 @GetMapping("getHightByUser") public ResultVO getHightByUser(String value){ //根据一个值查询多个字段 并高亮显示 这里的查询是取并集,即多个字段只需要有一个字段满足即可 //需要查询的字段 BoolQueryBuilder boolQueryBuilder= QueryBuilders.boolQuery() .should(QueryBuilders.matchQuery("info",value)) .should(QueryBuilders.matchQuery("name",value)); //构建高亮查询 NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(boolQueryBuilder) .withHighlightFields( new HighlightBuilder.Field("info") ,new HighlightBuilder.Field("name")) .withHighlightBuilder(new HighlightBuilder().preTags("").postTags("")) .build(); //查询 SearchHits
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
当我们需要多条件去查询的时候,需要了解should、must、mustNot、filter区别,然后进行组合出想要的条件
should:如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。相当于sql中的or
must:必须 匹配这些条件才能被包含进来,相当于sql中的 and(会分词)
mustNot:必须不 匹配这些条件才能被包含进来,相当于sql中的 not
filter:必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
构造查询条件 termQuery:精确查询(不分词)使用termQuery要注意的是,Elasticsearch5之后,取消了string类型,将原来的string类型拆分为text和keyword两种类型,他们的区别在于text会对字段进行分词处理,而keyword则不会。
matchQuery:匹配查询(分词)match query搜索的时候,首先会解析查询字符串,进行分词,然后查询,所以假如我搜索的条件输入的是"六年级",则会把各个年级(一年级至九年级)的数据都查询出来,因为其中都包含’年级’ 。
queryString:精确查询
wildcardQuery:模糊查询
keyword两种类型,他们的区别在于text会对字段进行分词处理,而keyword则不会。
rangeQuery:范围查询