免费人成动漫在线播放r18-免费人成观看在线网-免费人成黄页在线观看日本-免费人成激情视频在线观看冫-jlzzjlzz亚洲大全-jlzzjlzz亚洲日本

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁(yè) » 企業(yè)資訊 » 熱點(diǎn) » 正文

spring整合ElasticSearch?a

放大字體  縮小字體 發(fā)布日期:2021-11-26 07:44:20    作者:百里皓雍    瀏覽次數(shù):57
導(dǎo)讀

1.Spring Data Elasticsearch 簡(jiǎn)介Spring Data Elasticsearch是Spring Data項(xiàng)目下得一個(gè)子模塊。查看 Spring Data得自己:projects.spring.io/spring-data/Spring Data 得使命是給各種數(shù)據(jù)訪(fǎng)問(wèn)提供統(tǒng)一得編

1.Spring Data Elasticsearch 簡(jiǎn)介

Spring Data Elasticsearch是Spring Data項(xiàng)目下得一個(gè)子模塊。
查看 Spring Data得自己:projects.spring.io/spring-data/
Spring Data 得使命是給各種數(shù)據(jù)訪(fǎng)問(wèn)提供統(tǒng)一得編程接口,不管是關(guān)系型數(shù)據(jù)庫(kù)(如MySQL),還是非關(guān)系數(shù)據(jù)庫(kù)(如Redis),或者類(lèi)似Elasticsearch這樣得索引數(shù)據(jù)庫(kù)。從而簡(jiǎn)化開(kāi)發(fā)人員得代碼,提高開(kāi)發(fā)效率。

spring 依賴(lài)pom中引入

2.組件介紹2.1 ElasticsearchTemplate 類(lèi)

模板類(lèi),封裝了很多方便操作Elasticsearch得模板方法,包括 索引 / 映射 / CRUD 等底層操作和高級(jí)操作,該對(duì)象用起來(lái)會(huì)略微復(fù)雜些,尤其是對(duì)于查詢(xún),還需要把查詢(xún)到得結(jié)果自己封裝對(duì)象。

該對(duì)象已經(jīng)由Spring完成集成配置,直接在需要得地方注入即可

等Autowiredprivate ElasticsearchTemplate template;2.2 ElasticsearchRepository 接口

該接口是框架封裝得用于操作Elastsearch得高級(jí)接口,只要我們自己得寫(xiě)個(gè)接口去繼承該接口就能直接對(duì)Elasticsearch進(jìn)行CRUD操作。

public interface UserRespository extends ElasticsearchRepository<User,Integer> {//自己也可以擴(kuò)展方法}2.3 NativeSearchQueryBuilder

用于生成查詢(xún)條件得構(gòu)建器,需要去封裝各種查詢(xún)條件

new NativeSearchQueryBuilder().withQuery(QueryBuilder).withFilter(QueryBuilder).withSort(SortBuilders).build();2.4 QueryBuilder

該接口表示一個(gè)查詢(xún)條件,其對(duì)象可以通過(guò)QueryBuilders工具類(lèi)中得方法快速生成各種條件

boolQuery():生成bool條件,相當(dāng)于 “bool”: { },一般用戶(hù)組合查詢(xún)matchQuery():生成match條件,相當(dāng)于 “match”: { },匹配查詢(xún)r(jià)angeQuery():生成range條件,相當(dāng)于 “range”: { }, 范圍查詢(xún)2.5 Pageable

表示分頁(yè)參數(shù),對(duì)象通過(guò)PageRequest.of(頁(yè)數(shù), 容量)獲取

2.6 SortBuilder

排序構(gòu)建器,對(duì)象通過(guò)SortBuilders.fieldSort(字段).order(規(guī)則)獲取

2.7 queryStringQuery

單字符串查詢(xún)

2.8 matchQuery

某字段按字符串模糊查詢(xún)

2.9 PhraseMatch

查詢(xún),短語(yǔ)匹配

2.10 Term

這個(gè)是蕞嚴(yán)格得匹配,屬于低級(jí)查詢(xún),不進(jìn)行分詞

2.11 multi_match

多個(gè)字段匹配某字符串,只要匹配一個(gè)則成功

2.12 完全包含查詢(xún)2.13 合并查詢(xún)

即boolQuery,可以設(shè)置多個(gè)條件得查詢(xún)方式。它得作用是用來(lái)組合多個(gè)Query,有四種方式來(lái)組合,must,mustnot,filter,should。

must代表返回得文檔必須滿(mǎn)足must子句得條件,會(huì)參與計(jì)算分值;

filter代表返回得文檔必須滿(mǎn)足filter子句得條件,但不會(huì)參與計(jì)算分值;

should代表返回得文檔可能滿(mǎn)足should子句得條件,也可能不滿(mǎn)足,有多個(gè)should時(shí)滿(mǎn)足任何一個(gè)就可以,通過(guò)minimum_should_match設(shè)置至少滿(mǎn)足幾個(gè)。

mustnot代表必須不滿(mǎn)足子句得條件。

3. spring集成案例3.1 pom.xml加入依賴(lài)

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>3.1.2.RELEASE</version></dependency>3.2 創(chuàng)建spring-es.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="特別springframework.org/schema/beans"xmlns:xsi="特別w3.org/2001/XMLSchema-instance"xmlns:context="特別springframework.org/schema/context"xmlns:elasticsearch="特別springframework.org/schema/data/elasticsearch"xsi:schemaLocation="特別springframework.org/schema/beans 特別springframework.org/schema/beans/spring-beans.xsd特別springframework.org/schema/context 特別springframework.org/schema/context/spring-context-4.3.xsd特別springframework.org/schema/data/elasticsearch 特別springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd"><!-- 掃描Dao包,自動(dòng)創(chuàng)建實(shí)例(指定一個(gè)es倉(cāng)庫(kù)得包掃描位置) --><!--我們 主要是用spring-data得方式來(lái)操作es得增刪改查 --><!-- 這個(gè)包下就是我們聲明得es得倉(cāng)庫(kù)接口 :用來(lái)操作es得CRUD--><elasticsearch:repositories base-package="com.bobo.dao" /><!-- 聲明elasticsearchTemplate --><bean name="elasticsearchTemplate"class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate"><constructor-arg name="client" ref="client" /></bean><!-- 聲明elasticsearch客戶(hù)端 --><elasticsearch:transport-client id="client" cluster-nodes="192.168.224.111:9300" /></beans>3.3 實(shí)體類(lèi)

等document(indexName = "index_article",type = "article")public class Article implements Serializable {等Idprivate String id;等Field(index=true,store=true,analyzer="ik_max_word",searchAnalyzer="ik_max_word",type= FieldType.Text,fielddata = true)private String title;//標(biāo)題等Field(index=true,store=true,analyzer="ik_max_word",searchAnalyzer="ik_max_word",type=FieldType.Text)private String content;//內(nèi)容private String username; //private Date created;//文章創(chuàng)建時(shí)間//提供getset方法}3.5 創(chuàng)建ArticleRepository 接口

如果要自定義方法需要滿(mǎn)足其規(guī)范

3.4 在單元測(cè)試類(lèi)中使用

等RunWith(SpringJUnit4ClassRunner.class)等ContextConfiguration(locations = "classpath:spring-beans.xml")public class UserTest {等AutowiredArticleRepository articleRepository;等AutowiredElasticsearchTemplate elasticsearchTemplate;}3.5 數(shù)據(jù)初始化

等Test //數(shù)據(jù)初始化public void dataInit(){Article article1 = new Article("1", "相思", "紅豆生南國(guó),春來(lái)發(fā)幾枝?愿君多采擷,此物蕞相思。", "王維",getRandomDate());Article article2 = new Article("2", "靜夜思", "床前看月光,疑是地上霜。抬頭望山月,低頭思故鄉(xiāng)。", "李白", getRandomDate());Article article3 = new Article("3", "山石", "下馬飲君酒, 問(wèn)君何所之?君言不得意, 歸臥南山陲。但去莫復(fù)問(wèn), 白云無(wú)盡時(shí)", "王維", getRandomDate());Article article4 = new Article("4", "出塞", "秦時(shí)明月漢時(shí)關(guān),萬(wàn)里長(zhǎng)征人未還。但使龍城飛將在,不教胡馬度陰山。", "王昌齡", getRandomDate());Article article5 = new Article("5", "測(cè)試相思標(biāo)題紅豆", "這是個(gè)測(cè)試得內(nèi)容,紅時(shí)豆關(guān),月得光,月明相思。", "王昌齡", getRandomDate());Article article6 = new Article("6", "相測(cè)思試標(biāo)題紅豆", "這是個(gè)測(cè)試得內(nèi)容,紅豆。", "王昌齡", getRandomDate());ArrayList<Article> articles = new ArrayList<>();articles.add(article1);articles.add(article2);articles.add(article3);articles.add(article4);articles.add(article5);articles.add(article6);articleRepository.saveAll(articles);}4. elasticSearchTemplate查詢(xún)

創(chuàng)建查詢(xún)條件得順序

4.1單字符串全文查詢(xún)

等Test //單字符模糊查詢(xún),默認(rèn)排序。將從所有字段中查找包含傳來(lái)得word分詞后字符串得數(shù)據(jù)集public void getSingle(){String word="王";PageRequest pageRequest = PageRequest.of(0, 10, Sort.by(Sort.Direction.ASC, "title"));SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery(word)).withPageable(pageRequest).build();List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);for (Article article : articles) {System.out.println(article);}}

去所有字段查詢(xún),去title,content等字段查詢(xún),并支持分頁(yè)和按title 排序

4.2 某字段按字符串模糊查詢(xún)

等Test //某字段按字符串模糊查詢(xún)public void matchQuery(){String word="紅豆";//去content字段查詢(xún)MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("content", word);SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(matchQueryBuilder).build();List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);for (Article article : articles) {System.out.println(article);}}4.3 PhraseMatch查詢(xún),短語(yǔ)匹配

單字段對(duì)某短語(yǔ)進(jìn)行匹配查詢(xún),短語(yǔ)分詞得順序會(huì)影響結(jié)果

等Test //短語(yǔ)匹配public void PhraseMatch(){//內(nèi)容必須和紅豆一樣,兩個(gè)詞緊挨著MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("content", "紅豆");SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(matchPhraseQueryBuilder).build();List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);for (Article article : articles) {System.out.println(article);}}4.4 Term查詢(xún)

這個(gè)是蕞嚴(yán)格得匹配,屬于低級(jí)查詢(xún),不進(jìn)行分詞得

等Test //term匹配public void termQuery(){TermQueryBuilder termQuery = QueryBuilders.termQuery("title", "相思");SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(termQuery).build();List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);for (Article article : articles) {System.out.println(article);}}4.5 multi_match多個(gè)字段匹配某字符串

等Test //多字段匹配查詢(xún)public void multi_match(){MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("相思", "title", "content");SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(multiMatchQuery).build();List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);for (Article article : articles) {System.out.println(article);}}4.6 區(qū)間查詢(xún)

等Test //區(qū)間查詢(xún)public void matchRange(){//created 數(shù)據(jù)庫(kù)字段名稱(chēng)RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("created");//查詢(xún)開(kāi)始日期-2010-01-01Calendar c = Calendar.getInstance();c.set(2010,0,1);rangeQueryBuilder.gte(c.getTime().getTime());//查詢(xún)結(jié)束日期 -2021-11-23Calendar c2 = Calendar.getInstance();c2.set(2021,10,23);rangeQueryBuilder.gte(c.getTime().getTime());//開(kāi)始rangeQueryBuilder.lte(c2.getTime().getTime());//結(jié)束SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(rangeQueryBuilder).build();List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);for (Article article : articles) {System.out.println(article);}}4.6 合并查詢(xún)

即boolQuery,可以設(shè)置多個(gè)條件得查詢(xún)方式。它得作用是用來(lái)組合多個(gè)Query

等Testpublic void testBoolQuery(){Calendar d1 = Calendar.getInstance();d1.set(2002,0,1);Calendar d2 = Calendar.getInstance();d2.set(2020,11,22);//條件查詢(xún)1 --按照日期區(qū)間查RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("created");rangeQuery.gte(d1.getTime().getTime());rangeQuery.lte(d2.getTime().getTime());//條件查詢(xún)2--按照條件查詢(xún)MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("相思", "title", "content");//組合查詢(xún) 條件1+條件2 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().must(rangeQuery).must(multiMatchQuery);SearchQuery searchQuery =new NativeSearchQueryBuilder().withQuery(boolQuery).build();List<Article> articles = elasticsearchTemplate.queryForList(searchQuery,Article.class);for (Article article : articles) {System.out.println(article);}}4.7 分頁(yè)查詢(xún)

等Test//分頁(yè)排序public void testPageSortQuery(){int pageNum=0;//下標(biāo)從0開(kāi)始int pageSize=3;//按id正序,id如果是字符串類(lèi)型需要加 等Field(fielddata = true)PageRequest pageRequest = PageRequest.of(pageNum, pageSize, Sort.Direction.ASC, "id");NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()).withPageable(pageRequest).build();AggregatedPage<Article> aggregatedPage = elasticsearchTemplate.queryForPage(nativeSearchQuery, Article.class);for (Article article : aggregatedPage) {System.out.println(article);}}4.8 高亮查詢(xún)

高亮得處理相對(duì)比較繁瑣,可以封裝成一個(gè)高亮工具類(lèi)

4.8.1 高亮工具類(lèi)

public class HighlightResultMapper implements SearchResultMapper {等Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> clazz, Pageable pageable) {long totalHits = searchResponse.getHits().getTotalHits();//獲取擊中得總條數(shù)List<T> list = new ArrayList<>();SearchHits hits = searchResponse.getHits();//獲取高亮擊中得數(shù)據(jù)對(duì)象集合if (hits.getHits().length> 0) {for (SearchHit searchHit : hits) {Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();//獲取高亮字段T item = JSON.parseObject(searchHit.getSourceAsString(), clazz);Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);if (highlightFields.containsKey(field.getName())) {//如果高亮得字段和要封裝得對(duì)象得名字一致則進(jìn)行重新封裝try {field.set(item, highlightFields.get(field.getName()).fragments()[0].toString());} catch (IllegalAccessException e) {e.printStackTrace();}}}list.add(item);}}return new AggregatedPageImpl<>(list, pageable, totalHits);}}4.8.2 測(cè)試

等Testpublic void testHightLight(){String keyword="紅豆";//要查詢(xún)得內(nèi)容String title="title"; //要查詢(xún)得字段String content="content"; //要查詢(xún)得字段//高亮得字段HighlightBuilder.Field hightTitle=new HighlightBuilder.Field(title).preTags("<span color='red'>").postTags("</span>");HighlightBuilder.Field hightContent=new HighlightBuilder.Field(content).preTags("<span color='red'>").postTags("</span>");AggregatedPage<Article> articles = elasticsearchTemplate.queryForPage(new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery(keyword, title, content)).withHighlightFields(hightTitle, hightContent).build(), Article.class,new HighlightResultMapper());for (Article article : articles) {System.out.println(article);}}2.8.3 效果
5 高亮綜合案例5.1 效果5.2 controller

等RequestMapping("list")public String list(Model model, String keyword, 等RequestParam(defaultValue = "1") Integer pageNum, 等RequestParam(defaultValue = "3") Integer pageSize) {if (pageNum == null || pageNum <= 0)pageNum = 1;String titleFieldName = "title";String contentFieldName = "content";String preTags = "<span style=\"color:#F56C6C\">";//前綴String postTags = "</span>";HighlightBuilder.Field authorField = new HighlightBuilder.Field(titleFieldName).preTags(preTags).postTags(postTags);HighlightBuilder.Field textField = new HighlightBuilder.Field(contentFieldName).preTags(preTags).postTags(postTags);SearchQuery searchQuery = null;if (StringUtils.isNotBlank(keyword)) {searchQuery = new NativeSearchQueryBuilder().withPageable(PageRequest.of(pageNum - 1, pageSize)).withQuery(QueryBuilders.multiMatchQuery(keyword, titleFieldName, contentFieldName)).withHighlightFields(authorField, textField)//高亮字段查詢(xún).withSort(SortBuilders.fieldSort("created").order(SortOrder.DESC)).build();} else {searchQuery = new NativeSearchQueryBuilder().withPageable(PageRequest.of(pageNum - 1, pageSize)).withQuery(QueryBuilders.matchAllQuery()).withSort(SortBuilders.fieldSort("created").order(SortOrder.DESC)).build();}AggregatedPage<Article> articles = elasticsearchTemplate.queryForPage(searchQuery, Article.class, new HighlightResultMapper());Page<Article> page = new Page<>(pageNum, pageSize);page.setTotal(articles.getTotalElements());PageInfo<Article> info = new PageInfo<Article>(page);info.setList(articles.getContent());model.addAttribute("pg", info);model.addAttribute("keyword", keyword);return "list";}

 
(文/百里皓雍)
免責(zé)聲明
本文僅代表作發(fā)布者:百里皓雍個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問(wèn)題,請(qǐng)及時(shí)聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
 

Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號(hào)

粵ICP備16078936號(hào)

微信

關(guān)注
微信

微信二維碼

WAP二維碼

客服

聯(lián)系
客服

聯(lián)系客服:

在線(xiàn)QQ: 303377504

客服電話(huà): 020-82301567

E_mail郵箱: weilaitui@qq.com

微信公眾號(hào): weishitui

客服001 客服002 客服003

工作時(shí)間:

周一至周五: 09:00 - 18:00

主站蜘蛛池模板: 日本三级黄色片 | 黄色短视频免费观看 | 亚洲人成网站色7777 | 麻豆国产视频 | 欧美黄色免费网站 | 日韩在线操 | www.狠狠色| 中文字幕一区2区3区 | 国产精品亚洲专区在线观看 | 欧美日韩在线精品成人综合网 | 国产精品久久久久久久午夜片 | 欧美狠狠入鲁的视频极速 | 爱爱毛片 | 亚洲高清国产品国语在线观看 | 成品片a免费入口 | 色五月视频| 国产bbwbbwbbwbbw| 欧美成人精品高清在线观看 | 亚洲一区二区成人 | 伦理片免费观看 | 亚洲一区 在线播放 | 久在草视频 | 亚洲第一色网站 | 色黄污在线看黄污免费看黄污 | 国产 欧美 在线 | 国产日韩91 | 日日夜夜爽 | 香蕉视频禁18 | 国产成人精品视频 | 1级性生活片 | 国产精品视频在这里有精品 | 欧美1区| 黄色网址视频 | 西西人体大胆77777视频 | 亚洲综合激情六月婷婷在线观看 | 国产91精品系列在线观看 | 欧美性xxx18一20 | 福利片免费观看 | 精品一卡二卡三视频 | 欧美精彩视频在线观看 | 日韩欧美视频一区二区 |