ElasticSearch第二天
ElasticSearch第二天
學習目標:
第一章 ElasticSearch編程操作
1.1 創建工程,導入坐標
pom.xml坐標
<dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>5.6.8</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.6.8</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-to-slf4j</artifactId><version>2.9.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.24</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.21</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency> </dependencies>1.2 創建索引index
@Test //創建索引 public void test1() throws Exception{// 創建Client連接對象Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));//創建名稱為blog2的索引client.admin().indices().prepareCreate("blog2").get();//釋放資源client.close(); }[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-r8aT491t-1638370275531)(image/1.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xj7xxgmk-1638370275533)(image/2.png)]
1.3 創建映射mapping
@Test //創建映射 public void test3() throws Exception{// 創建Client連接對象Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 添加映射/*** 格式:* "mappings" : {"article" : {"dynamic" : "false","properties" : {"id" : { "type" : "string" },"content" : { "type" : "string" },"author" : { "type" : "string" }}}}*/XContentBuilder builder = XContentFactory.jsonBuilder().startObject().startObject("article").startObject("properties").startObject("id").field("type", "integer").field("store", "yes").endObject().startObject("title").field("type", "string").field("store", "yes").field("analyzer", "ik_smart").endObject().startObject("content").field("type", "string").field("store", "yes").field("analyzer", "ik_smart").endObject().endObject().endObject().endObject();// 創建映射PutMappingRequest mapping = Requests.putMappingRequest("blog2").type("article").source(builder);client.admin().indices().putMapping(mapping).get();//釋放資源client.close(); }[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7kGdCYXc-1638370275535)(image/4.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-r5wi0cYE-1638370275536)(image/5.png)]
1.4 建立文檔document
1.4.1 建立文檔(通過XContentBuilder)
@Test //創建文檔(通過XContentBuilder) public void test4() throws Exception{// 創建Client連接對象Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));//創建文檔信息XContentBuilder builder = XContentFactory.jsonBuilder().startObject().field("id", 1).field("title", "ElasticSearch是一個基于Lucene的搜索服務器").field("content","它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用于云計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。").endObject();// 建立文檔對象/*** 參數一blog1:表示索引對象* 參數二article:類型* 參數三1:建立id*/client.prepareIndex("blog2", "article", "1").setSource(builder).get();//釋放資源client.close(); }[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rMm3suAD-1638370275538)(image/6.png)]
1.4.2 建立文檔(使用Jackson轉換實體)
1)創建Article實體
public class Article {private Integer id;private String title;private String content;getter/setter... }2)添加jackson坐標
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.8.1</version> </dependency> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.8.1</version> </dependency> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.8.1</version> </dependency>3)代碼實現
@Test //創建文檔(通過實體轉json) public void test5() throws Exception{// 創建Client連接對象Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 描述json 數據//{id:xxx, title:xxx, content:xxx}Article article = new Article();article.setId(2);article.setTitle("搜索工作其實很快樂");article.setContent("我們希望我們的搜索解決方案要快,我們希望有一個零配置和一個完全免費的搜索模式,我們希望能夠簡單地使用JSON通過HTTP的索引數據,我們希望我們的搜索服務器始終可用,我們希望能夠一臺開始并擴展到數百,我們要實時搜索,我們要簡單的多租戶,我們希望建立一個云的解決方案。Elasticsearch旨在解決所有這些問題和更多的問題。");ObjectMapper objectMapper = new ObjectMapper();// 建立文檔client.prepareIndex("blog2", "article", article.getId().toString())//.setSource(objectMapper.writeValueAsString(article)).get();.setSource(objectMapper.writeValueAsString(article).getBytes(), XContentType.JSON).get();//釋放資源client.close(); }[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-G6uLiECo-1638370275539)(image/7.png)]
1.5 查詢文檔操作
1.5.1關鍵詞查詢
@Test public void testTermQuery() throws Exception{//1、創建es客戶端連接對象Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));//2、設置搜索條件SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.termQuery("content", "搜索")).get();//3、遍歷搜索結果數據SearchHits hits = searchResponse.getHits(); // 獲取命中次數,查詢結果有多少對象System.out.println("查詢結果有:" + hits.getTotalHits() + "條");Iterator<SearchHit> iterator = hits.iterator();while (iterator.hasNext()) {SearchHit searchHit = iterator.next(); // 每個查詢對象System.out.println(searchHit.getSourceAsString()); // 獲取字符串格式打印System.out.println("title:" + searchHit.getSource().get("title"));}//4、釋放資源client.close();}2.5.2 字符串查詢
@Test public void testStringQuery() throws Exception{//1、創建es客戶端連接對象Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));//2、設置搜索條件SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.queryStringQuery("搜索")).get();//3、遍歷搜索結果數據SearchHits hits = searchResponse.getHits(); // 獲取命中次數,查詢結果有多少對象System.out.println("查詢結果有:" + hits.getTotalHits() + "條");Iterator<SearchHit> iterator = hits.iterator();while (iterator.hasNext()) {SearchHit searchHit = iterator.next(); // 每個查詢對象System.out.println(searchHit.getSourceAsString()); // 獲取字符串格式打印System.out.println("title:" + searchHit.getSource().get("title"));}//4、釋放資源client.close();}2.5.2 使用文檔ID查詢文檔
@Testpublic void testIdQuery() throws Exception {//client對象為TransportClient對象SearchResponse response = client.prepareSearch("blog1").setTypes("article")//設置要查詢的id.setQuery(QueryBuilders.idsQuery().addIds("test002"))//執行查詢.get();//取查詢結果SearchHits searchHits = response.getHits();//取查詢結果總記錄數System.out.println(searchHits.getTotalHits());Iterator<SearchHit> hitIterator = searchHits.iterator();while(hitIterator.hasNext()) {SearchHit searchHit = hitIterator.next();//打印整行數據System.out.println(searchHit.getSourceAsString());}}2.6 查詢文檔分頁操作
2.6.1 批量插入數據
@Test //批量插入100條數據 public void test9() throws Exception{// 創建Client連接對象Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));ObjectMapper objectMapper = new ObjectMapper();for (int i = 1; i <= 100; i++) {// 描述json 數據Article article = new Article();article.setId(i);article.setTitle(i + "搜索工作其實很快樂");article.setContent(i+ "我們希望我們的搜索解決方案要快,我們希望有一個零配置和一個完全免費的搜索模式,我們希望能夠簡單地使用JSON通過HTTP的索引數據,我們希望我們的搜索服務器始終可用,我們希望能夠一臺開始并擴展到數百,我們要實時搜索,我們要簡單的多租戶,我們希望建立一個云的解決方案。Elasticsearch旨在解決所有這些問題和更多的問題。");// 建立文檔client.prepareIndex("blog2", "article", article.getId().toString())//.setSource(objectMapper.writeValueAsString(article)).get();.setSource(objectMapper.writeValueAsString(article).getBytes(),XContentType.JSON).get();}//釋放資源client.close(); }[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wX830A1N-1638370275540)(image/12.png)]
2.6.2 分頁查詢
@Test //分頁查詢 public void test10() throws Exception{// 創建Client連接對象Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 搜索數據SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.matchAllQuery());//默認每頁10條記錄// 查詢第2頁數據,每頁20條//setFrom():從第幾條開始檢索,默認是0。//setSize():每頁最多顯示的記錄數。searchRequestBuilder.setFrom(0).setSize(5);SearchResponse searchResponse = searchRequestBuilder.get();SearchHits hits = searchResponse.getHits(); // 獲取命中次數,查詢結果有多少對象System.out.println("查詢結果有:" + hits.getTotalHits() + "條");Iterator<SearchHit> iterator = hits.iterator();while (iterator.hasNext()) {SearchHit searchHit = iterator.next(); // 每個查詢對象System.out.println(searchHit.getSourceAsString()); // 獲取字符串格式打印System.out.println("id:" + searchHit.getSource().get("id"));System.out.println("title:" + searchHit.getSource().get("title"));System.out.println("content:" + searchHit.getSource().get("content"));System.out.println("-----------------------------------------");}//釋放資源client.close(); }[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sRDpq6nS-1638370275542)(image/13.png)]
2.7 查詢結果高亮操作
2.7.1 什么是高亮顯示
在進行關鍵字搜索時,搜索出的內容中的關鍵字會顯示不同的顏色,稱之為高亮
百度搜索關鍵字"傳智播客"
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZJj8nMfB-1638370275543)(image/14.png)]
京東商城搜索"筆記本"
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uRjplTEq-1638370275544)(image/15.png)]
2.7.2 高亮顯示的html分析
通過開發者工具查看高亮數據的html代碼實現:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rMiLOtEW-1638370275545)(image/16.png)]
ElasticSearch可以對查詢出的內容中關鍵字部分進行標簽和樣式的設置,但是你需要告訴ElasticSearch使用什么標簽對高亮關鍵字進行包裹
2.7.3 高亮顯示代碼實現
@Test //高亮查詢 public void test11() throws Exception{// 創建Client連接對象Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 搜索數據SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.termQuery("title", "搜索"));//設置高亮數據HighlightBuilder hiBuilder=new HighlightBuilder();hiBuilder.preTags("<font style='color:red'>");hiBuilder.postTags("</font>");hiBuilder.field("title");searchRequestBuilder.highlighter(hiBuilder);//獲得查詢結果數據SearchResponse searchResponse = searchRequestBuilder.get();//獲取查詢結果集SearchHits searchHits = searchResponse.getHits();System.out.println("共搜到:"+searchHits.getTotalHits()+"條結果!");//遍歷結果for(SearchHit hit:searchHits){System.out.println("String方式打印文檔搜索內容:");System.out.println(hit.getSourceAsString());System.out.println("Map方式打印高亮內容");System.out.println(hit.getHighlightFields());System.out.println("遍歷高亮集合,打印高亮片段:");Text[] text = hit.getHighlightFields().get("title").getFragments();for (Text str : text) {System.out.println(str);}}//釋放資源client.close(); }[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oo40ZXsK-1638370275546)(image/17.png)]
第三章 Spring Data ElasticSearch 使用
3.1 Spring Data ElasticSearch簡介
3.1.1 什么是Spring Data
Spring Data是一個用于簡化數據庫訪問,并支持云服務的開源框架。其主要目標是使得對數據的訪問變得方便快捷,并支持map-reduce框架和云計算數據服務。 Spring Data可以極大的簡化JPA的寫法,可以在幾乎不用寫實現的情況下,實現對數據的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的功能。
Spring Data的官網:http://projects.spring.io/spring-data/
Spring Data常用的功能模塊如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NvpcAooJ-1638370275547)(image\18.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-r8dhZOOs-1638370275548)(image\19.png)]
3.1.2 什么是Spring Data ElasticSearch
Spring Data ElasticSearch 基于 spring data API 簡化 elasticSearch操作,將原始操作elasticSearch的客戶端API 進行封裝 。Spring Data為Elasticsearch項目提供集成搜索引擎。Spring Data Elasticsearch POJO的關鍵功能區域為中心的模型與Elastichsearch交互文檔和輕松地編寫一個存儲庫數據訪問層。
官方網站:http://projects.spring.io/spring-data-elasticsearch/
3.2 Spring Data ElasticSearch入門
1)導入Spring Data ElasticSearch坐標
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>itheima_elasticsearch_demo3</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>5.6.8</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.6.8</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-to-slf4j</artifactId><version>2.9.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.24</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.21</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.8.1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.8.1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.8.1</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>3.0.5.RELEASE</version><exclusions><exclusion><groupId>org.elasticsearch.plugin</groupId><artifactId>transport-netty4-client</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.4.RELEASE</version></dependency></dependencies></project>2)創建applicationContext.xml配置文件,引入elasticsearch命名空間
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/data/elasticsearchhttp://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd"></beans>3)編寫實體Article
package com.itheima.domain;public class Article {private Integer id;private String title;private String content;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Overridepublic String toString() {return "Article [id=" + id + ", title=" + title + ", content=" + content + "]";}}4)編寫Dao
package com.itheima.dao;import com.itheima.domain.Article; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;@Repository public interface ArticleRepository extends ElasticsearchRepository<Article, Integer> {}5)編寫Service
package com.itheima.service;import com.itheima.domain.Article;public interface ArticleService {public void save(Article article);} package com.itheima.service.impl;import com.itheima.dao.ArticleRepository; import com.itheima.domain.Article; import com.itheima.service.ArticleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;@Service public class ArticleServiceImpl implements ArticleService {@Autowiredprivate ArticleRepository articleRepository;public void save(Article article) {articleRepository.save(article);}}6) 配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/data/elasticsearchhttp://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd"><!-- 掃描Dao包,自動創建實例 --><elasticsearch:repositories base-package="com.itheima.dao"/><!-- 掃描Service包,創建Service的實體 --><context:component-scan base-package="com.itheima.service"/><!-- 配置elasticSearch的連接 --><!-- 配置elasticSearch的連接 --><elasticsearch:transport-client id="client" cluster-nodes="localhost:9300" cluster-name="my-elasticsearch"/><!-- ElasticSearch模版對象 --><bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate"><constructor-arg name="client" ref="client"></constructor-arg></bean></beans>7)配置實體
基于spring data elasticsearch注解配置索引、映射和實體的關系
package com.itheima.domain;import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType;//@Document 文檔對象 (索引信息、文檔類型 ) @Document(indexName="blog3",type="article") public class Article {//@Id 文檔主鍵 唯一標識@Id//@Field 每個文檔的字段配置(類型、是否分詞、是否存儲、分詞器 )@Field(store=true, index = false,type = FieldType.Integer)private Integer id;@Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type = FieldType.text)private String title;@Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type = FieldType.text)private String content;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Overridepublic String toString() {return "Article [id=" + id + ", title=" + title + ", content=" + content + "]";}} 其中,注解解釋如下: @Document(indexName="blob3",type="article"):indexName:索引的名稱(必填項)type:索引的類型 @Id:主鍵的唯一標識 @Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type = FieldType.text)index:是否設置分詞analyzer:存儲時使用的分詞器searchAnalyze:搜索時使用的分詞器store:是否存儲type: 數據類型8)創建測試類SpringDataESTest
package com.itheima.test;import com.itheima.domain.Article; import com.itheima.service.ArticleService; import org.elasticsearch.client.transport.TransportClient; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:applicationContext.xml") public class SpringDataESTest {@Autowiredprivate ArticleService articleService;@Autowiredprivate TransportClient client;@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;/**創建索引和映射*/@Testpublic void createIndex(){elasticsearchTemplate.createIndex(Article.class);elasticsearchTemplate.putMapping(Article.class);}/**測試保存文檔*/@Testpublic void saveArticle(){Article article = new Article();article.setId(100);article.setTitle("測試SpringData ElasticSearch");article.setContent("Spring Data ElasticSearch 基于 spring data API 簡化 elasticSearch操作,將原始操作elasticSearch的客戶端API 進行封裝 \n" +" Spring Data為Elasticsearch Elasticsearch項目提供集成搜索引擎");articleService.save(article);}}3.3 Spring Data ElasticSearch的常用操作
3.3.1 增刪改查方法測試
package com.itheima.service;import com.itheima.domain.Article; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable;public interface ArticleService {//保存public void save(Article article);//刪除public void delete(Article article);//查詢全部public Iterable<Article> findAll();//分頁查詢public Page<Article> findAll(Pageable pageable);} package com.itheima.service.impl;import com.itheima.dao.ArticleRepository; import com.itheima.domain.Article; import com.itheima.service.ArticleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service;@Service public class ArticleServiceImpl implements ArticleService {@Autowiredprivate ArticleRepository articleRepository;public void save(Article article) {articleRepository.save(article);}public void delete(Article article) {articleRepository.delete(article);}public Iterable<Article> findAll() {Iterable<Article> iter = articleRepository.findAll();return iter;}public Page<Article> findAll(Pageable pageable) {return articleRepository.findAll(pageable);} } package com.itheima.test;import com.itheima.domain.Article; import com.itheima.service.ArticleService; import org.elasticsearch.client.transport.TransportClient; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:applicationContext.xml") public class SpringDataESTest {@Autowiredprivate ArticleService articleService;@Autowiredprivate TransportClient client;@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;/**創建索引和映射*/@Testpublic void createIndex(){elasticsearchTemplate.createIndex(Article.class);elasticsearchTemplate.putMapping(Article.class);}/**測試保存文檔*/@Testpublic void saveArticle(){Article article = new Article();article.setId(100);article.setTitle("測試SpringData ElasticSearch");article.setContent("Spring Data ElasticSearch 基于 spring data API 簡化 elasticSearch操作,將原始操作elasticSearch的客戶端API 進行封裝 \n" +" Spring Data為Elasticsearch Elasticsearch項目提供集成搜索引擎");articleService.save(article);}/**測試保存*/@Testpublic void save(){Article article = new Article();article.setId(1001);article.setTitle("elasticSearch 3.0版本發布");article.setContent("ElasticSearch是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口");articleService.save(article);}/**測試更新*/@Testpublic void update(){Article article = new Article();article.setId(1001);article.setTitle("elasticSearch 3.0版本發布...更新");article.setContent("ElasticSearch是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口");articleService.save(article);}/**測試刪除*/@Testpublic void delete(){Article article = new Article();article.setId(1001);articleService.delete(article);}/**批量插入*/@Testpublic void save100(){for(int i=1;i<=100;i++){Article article = new Article();article.setId(i);article.setTitle(i+"elasticSearch 3.0版本發布..,更新");article.setContent(i+"ElasticSearch是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口");articleService.save(article);}}/**分頁查詢*/@Testpublic void findAllPage(){Pageable pageable = PageRequest.of(1,10);Page<Article> page = articleService.findAll(pageable);for(Article article:page.getContent()){System.out.println(article);}} }3.3.2 常用查詢命名規則
| and | findByField1AndField2 | 根據Field1和Field2獲得數據 | findByTitleAndContent |
| or | findByField1OrField2 | 根據Field1或Field2獲得數據 | findByTitleOrContent |
| is | findByField | 根據Field獲得數據 | findByTitle |
| not | findByFieldNot | 根據Field獲得補集數據 | findByTitleNot |
| between | findByFieldBetween | 獲得指定范圍的數據 | findByPriceBetween |
| lessThanEqual | findByFieldLessThan | 獲得小于等于指定值的數據 | findByPriceLessThan |
3.3.3 查詢方法測試
1)dao層實現
package com.itheima.dao;import com.itheima.domain.Article; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import java.util.List;public interface ArticleRepository extends ElasticsearchRepository<Article, Integer> {//根據標題查詢List<Article> findByTitle(String condition);//根據標題查詢(含分頁)Page<Article> findByTitle(String condition, Pageable pageable); }2)service層實現
public interface ArticleService {//根據標題查詢List<Article> findByTitle(String condition);//根據標題查詢(含分頁)Page<Article> findByTitle(String condition, Pageable pageable); } package com.itheima.service.impl;import com.itheima.dao.ArticleRepository; import com.itheima.domain.Article; import com.itheima.service.ArticleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service;import java.util.List;@Service public class ArticleServiceImpl implements ArticleService {@Autowiredprivate ArticleRepository articleRepository;public List<Article> findByTitle(String condition) {return articleRepository.findByTitle(condition);}public Page<Article> findByTitle(String condition, Pageable pageable) {return articleRepository.findByTitle(condition,pageable);}}3)測試代碼
package com.itheima.test;import com.itheima.domain.Article; import com.itheima.service.ArticleService; import org.elasticsearch.client.transport.TransportClient; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:applicationContext.xml") public class SpringDataESTest {@Autowiredprivate ArticleService articleService;@Autowiredprivate TransportClient client;@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;/**條件查詢*/@Testpublic void findByTitle(){String condition = "版本";List<Article> articleList = articleService.findByTitle(condition);for(Article article:articleList){System.out.println(article);}}/**條件分頁查詢*/@Testpublic void findByTitlePage(){String condition = "版本";Pageable pageable = PageRequest.of(2,10);Page<Article> page = articleService.findByTitle(condition,pageable);for(Article article:page.getContent()){System.out.println(article);}}}###3.3.4使用Elasticsearch的原生查詢對象進行查詢。
@Testpublic void findByNativeQuery() {//創建一個SearchQuery對象SearchQuery searchQuery = new NativeSearchQueryBuilder()//設置查詢條件,此處可以使用QueryBuilders創建多種查詢.withQuery(QueryBuilders.queryStringQuery("備份節點上沒有數據").defaultField("title"))//還可以設置分頁信息.withPageable(PageRequest.of(1, 5))//創建SearchQuery對象.build();//使用模板對象執行查詢elasticsearchTemplate.queryForList(searchQuery, Article.class).forEach(a-> System.out.println(a));}總結
以上是生活随笔為你收集整理的ElasticSearch第二天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElasticSearch第一天
- 下一篇: MySQL基础课堂笔记