pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>第一种最简单方式
ElasticsearchTemplate.class package com.example.demo; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import java.net.InetAddress; import java.net.UnknownHostException; public class Test { public static void main(String[] args) { Settings esSettings = Settings.builder() .put("cluster.name", "elasticsearch") .put("client.transport.sniff", false).build(); PreBuiltTransportClient client = new PreBuiltTransportClient(esSettings); try { client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9300)); } catch (UnknownHostException e) { e.printStackTrace(); } ElasticsearchTemplate template = new ElasticsearchTemplate(client); template.createIndex(Item.class); template.putMapping(Item.class); template.deleteIndex(Item.class); } } package com.example.demo; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.*; @Document(indexName = "indexlist",type = "type") public class Item { @Id private Long id; //这样写的话相当于有三个字段 三个字段有不同的行为 第一个title和title.fullText 具有相同的行为searchAnalyzer只在搜索时 其他情况譬如创建索引等等用粗粒度索引 @MultiField( mainField = @Field(type = FieldType.Text,searchAnalyzer = "ik_max_word",analyzer = "ik_smart"), otherFields = { //不建立分词索引 @InnerField(type = FieldType.Keyword, suffix = "exactly" ), @InnerField(type = FieldType.Text, suffix = "fullText" ,searchAnalyzer = "ik_max_word",analyzer = "ik_smart") } ) private String title; //啥都不写默认映射两个一个text分词 一个keyword不分词 private String categroy; //text会分词建立索引 默认分词器 一个字一个字的分 @Field(type = FieldType.Text) private String brand; @Field(type = FieldType.Double) private Double price; //默认都会建立索引 @Field(index = false,type = FieldType.Keyword) private String images; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getCategroy() { return categroy; } public void setCategroy(String categroy) { this.categroy = categroy; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public Item() { } public Item(Long id, String title, String categroy, String brand, Double price, String images) { this.id = id; this.title = title; this.categroy = categroy; this.brand = brand; this.price = price; this.images = images; } @Override public String toString() { return "Item{" + "id=" + id + ", title='" + title + '\'' + ", categroy='" + categroy + '\'' + ", brand='" + brand + '\'' + ", price=" + price + ", images='" + images + '\'' + '}'; } }第二种整合
application.properties
spring.data.elasticsearch.cluster-nodes=172.20.5.3:9300 spring.data.elasticsearch.cluster-name=logging-dev package com.example.demo; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface ItemReposity extends ElasticsearchRepository<Item,Long> { Iterable<Item> findByPriceBetween(String s, String s1); } package com.example.demo; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.search.suggest.SortBy; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import java.util.ArrayList; import java.util.List; @SpringBootTest class DemoApplicationTests { @Autowired private ItemReposity itemReposity; @Test void aaa() { List<Item> list = new ArrayList<>(); Item item = new Item(1L, "小米手机list", " 手机", "小米", 34.00, "http://image.baidu.com/13123.jpg"); Item item1 = new Item(2L, "小米手机list1", " 手机", "小米真的很不错啊", 3499.00, "http://image.baidu.com/13123.jpg"); Item item2 = new Item(3L, "小米手机list1", " 手机", "测试", 33.00, "http://image.baidu.com/13123.jpg"); Item item3 = new Item(4L, "小米手机list1", " 手机", "测试", 34.00, "http://image.baidu.com/13123.jpg"); Item item4 = new Item(5L, "小米手机list1", " 手机", "小米", 499.00, "http://image.baidu.com/13123.jpg"); list.add(item); list.add(item1); list.add(item2); list.add(item3); list.add(item4); itemReposity.saveAll(list); Iterable<Item> itemList = this.itemReposity.findByPriceBetween("499.00","1499.00"); for(Item it:itemList){ System.out.println(it); } System.out.println("执行成功"); } @Test public void search(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //完全匹配 query.withQuery(QueryBuilders.termQuery("title.fullText","小米")); Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } @Test public void search0(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //完全匹配 可以匹配多个字段 query.withQuery(QueryBuilders.termsQuery("title","小米")); Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } @Test public void search1(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //这个会分词查询 前提是有分词器 和通配符并不一样 // ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。 //ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合; //standard 默认分词器会一个字一个字的拆分 比如会将“中华人民共和国国歌”拆分中,华,人,名 存入倒排索引List 转为list小写 //重点来了 matchQuery和termQuery的区别 是在查询前先把查询条件给分掉 也按默认分 默认分词器和上面一个字一个字匹配只要返回相同的字就返回 //所以说这个意义不大还是termQuey好 只要你指定分词器人家本来就分好了这个只不过把查询条件分一分 query.withQuery(QueryBuilders.matchQuery("brand","小米真的很不错啊")); //query.withQuery(QueryBuilders.multiMatchQuery("title","小米手机")); //完全匹配 Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } @Test public void search2(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //按条件查询must等于And mustNot等于 != 还有个should 相当于or 还有boolQuery是必须要加的 query.withQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("brand","测试")).mustNot(QueryBuilders.termQuery("price","33"))); //query.withQuery(QueryBuilders.multiMatchQuery("title","小米手机")); //完全匹配 Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } @Test public void search3(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //很明显只查询指定id的 query.withQuery(QueryBuilders.idsQuery().addIds("1")); Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } @Test public void search4(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //前缀查询 query.withQuery(QueryBuilders.prefixQuery("title","小米")); Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } @Test public void search5(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //通配符查询 query.withQuery(QueryBuilders.wildcardQuery("brand","小*")); Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } @Test public void search6(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //模糊查询分词 我也不知道啥 query.withQuery(QueryBuilders.fuzzyQuery("brand","小米")); Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } @Test public void search7(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //基于内容的推荐我也不知道啊没试验出来 query.withQuery(QueryBuilders.moreLikeThisQuery(new String[]{"title"},new String[]{"小米手机list"},null)); Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } //分页排序 @Test public void search8(){ NativeSearchQueryBuilder query = new NativeSearchQueryBuilder(); //完全匹配 可以匹配多个字段 query.withQuery(QueryBuilders.termsQuery("title","小米手机list","小米手机list1")); int page = 0; int pageSize = 2; Sort sort = Sort.by(Sort.Direction.DESC,"title"); //或者也可以 // query.withSort(SortBuilders.fieldSort("title").order(SortOrder.DESC)); query.withPageable(PageRequest.of(page,pageSize,sort)); Page<Item> items = this.itemReposity.search(query.build()); long tota1 = items.getTotalElements(); for(Item it:items){ System.out.println(it); } } }
版本问题
引用的jar包什么版本 就一定要es什么高版本
不然这个会出现格式对不上
/** * 创建时间 */ @Field(type = FieldType.Date,format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; 7.6版本 必须加上格式 不然会报错 注意精度问题
es不能修改索引类型 最好只有String可以用keyword 这不会分词