Sboote网站源码分享,ssm网站源码

大家好,今天给各位分享Sboote网站源码分享的一些知识,其中也会对ssm网站源码进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

当前SpringBoot很是流行,包括我自己,也是在用SpringBoot集成其他框架进行项目开发,所以这一节,我们一起来探讨SpringBoot整合ElasticSearch的问题。

本文主要讲以下内容:

第一部分,通读文档

第二部分,SpringBoot整合ElasticSearch

第三部分,基本的CRUD操作

第四部分,搜索

第五部分,例子

还没有学过Elasticsearch的朋友,可以先学这个系列的第一节(这个系列共三节),如果你有不明白或者不正确的地方,可以给我评论、留言或者私信。

第一步,通读文档

SpringDataElasticsearch官方文档,这是当前最新的文档。

关于repository

文档一开始就介绍CrudRepository,比如,继承Repository,其他比如JpaRepository、MongoRepository是继承CrudRepository。也对其中的方法做了简单说明,我们一起来看一下:

publicinterfaceCrudRepository<T,IDextendsSerializable>\nextendsRepository<T,ID>{\n\n//Savesthegivenentity.\n<SextendsT>Ssave(Sentity);\n\n//ReturnstheentityidentifiedbythegivenID.\nOptional<T>findById(IDprimaryKey);\n\n//Returnsallentities.\nIterable<T>findAll();\n\n//Returnsthenumberofentities.\nlongcount();\n\n//Deletesthegivenentity.\nvoiddelete(Tentity);\n\n//IndicateswhetheranentitywiththegivenIDexists.\nbooleanexistsById(IDprimaryKey);\n\n//…morefunctionalityomitted.\n}

好了,下面我们看一下今天的主角ElasticsearchRepository他是怎样的吧。

这说明什么?

用法和JPA一样;再这他除了有CRUD的基本功能之外,还有分页和排序。

清楚了这之后,是不是应该考虑该如何使用了呢?

如何用?

没错,接下来,开始说如何用,也写了很多示例代码。相对来说,还是比较简单,这里就贴一下代码就行了吧。

interfacePersonRepositoryextendsRepository<User,Long>{\n\nList<Person>findByEmailAddressAndLastname(EmailAddressemailAddress,Stringlastname);\n\n//Enablesthedistinctflagforthequery\nList<Person>findDistinctPeopleByLastnameOrFirstname(Stringlastname,Stringfirstname);\nList<Person>findPeopleDistinctByLastnameOrFirstname(Stringlastname,Stringfirstname);\n\n//Enablingignoringcaseforanindividualproperty\nList<Person>findByLastnameIgnoreCase(Stringlastname);\n//Enablingignoringcaseforallsuitableproperties\nList<Person>findByLastnameAndFirstnameAllIgnoreCase(Stringlastname,Stringfirstname);\n\n//EnablingstaticORDERBYforaquery\nList<Person>findByLastnameOrderByFirstnameAsc(Stringlastname);\nList<Person>findByLastnameOrderByFirstnameDesc(Stringlastname);\n}

是不是这样,就可以正常使用了呢?

问题

当然可以,但是如果错了问题怎么办呢,官网写了一个常见的问题,比如包扫描问题,没有你要的方法。

interfaceHumanRepository{\nvoidsomeHumanMethod(Useruser);\n}\n\nclassHumanRepositoryImplimplementsHumanRepository{\n\npublicvoidsomeHumanMethod(Useruser){\n//Yourcustomimplementation\n}\n}\n\ninterfaceContactRepository{\n\nvoidsomeContactMethod(Useruser);\n\nUseranotherContactMethod(Useruser);\n}\n\nclassContactRepositoryImplimplementsContactRepository{\n\npublicvoidsomeContactMethod(Useruser){\n//Yourcustomimplementation\n}\n\npublicUseranotherContactMethod(Useruser){\n//Yourcustomimplementation\n}\n}

你也可以自己写接口,并且去实现它。

说完理论,作为我,应该在实际的代码中如何运用呢?

示例

官方也提供了很多示例代码,我们一起来看看。

@Controller\nclassPersonController{\n\n@AutowiredPersonRepositoryrepository;\n\n@RequestMapping(value=&34;,method=RequestMethod.GET)\nHttpEntity<PagedResources<Person>>persons(Pageablepageable,\nPagedResourcesAssemblerassembler){\n\nPage<Person>persons=repository.findAll(pageable);\nreturnnewResponseEntity<>(assembler.toResources(persons),HttpStatus.OK);\n}\n}

这段代码相对来说还是十分经典的,我相信很多人都看到别人的代码,可能都会问,它为什么会这么用呢,答案或许就在这里吧。

当然,这是以前的代码,或许现在用不一定合适。

高级搜索

终于到高潮了!

学完我的第一节,你应该已经发现了,Elasticsearch搜索是一件十分复杂的事,为了用好它,我们不得不学好它。一起加油。

到这里,官方文档我们算是过了一遍了,大致明白了,他要告诉我们什么。其实,文档还有很多内容,可能你遇到的问题都能在里面找到答案。

最后,我们继续看一下官网写的一段处理得十分优秀的一段代码吧:

SearchQuerysearchQuery=newNativeSearchQueryBuilder()\n.withQuery(matchAllQuery())\n.withIndices(INDEX_NAME)\n.withTypes(TYPE_NAME)\n.withFields(&34;)\n.withPageable(PageRequest.of(0,10))\n.build();\n\nCloseableIterator<SampleEntity>stream=elasticsearchTemplate.stream(searchQuery,SampleEntity.class);\n\nList<SampleEntity>sampleEntities=newArrayList<>();\nwhile(stream.hasNext()){\nsampleEntities.add(stream.next());\n}

第二部分,SpringBoot整合ElasticSearch

添加依赖

implementation&39;

添加配置

spring:\ndata:\nelasticsearch:\ncluster-nodes:localhost:9300\ncluster-name:es-wyf

这样就完成了整合,接下来我们用两种方式操作。

Model

我们先写一个的实体类,借助这个实体类呢来完成基础的CRUD功能。

@Data\n@Accessors(chain=true)\n@Document(indexName=&34;,type=&34;)\npublicclassBlogModelimplementsSerializable{\n\nprivatestaticfinallongserialVersionUID=6320548148250372657L;\n\n@Id\nprivateStringid;\n\nprivateStringtitle;\n\n//@Field(type=FieldType.Date,format=DateFormat.basic_date)\n@DateTimeFormat(pattern=&34;)\n@JsonFormat(pattern=&34;,timezone=&34;)\nprivateDatetime;\n}

注意id字段是必须的,可以不写注解@Id。

publicinterfaceBlogRepositoryextendsElasticsearchRepository<BlogModel,String>{\n}

第三部分,CRUD

基础操作的代码,都是在BlogController里面写。

@RestController\n@RequestMapping(&34;)\npublicclassBlogController{\n@Autowired\nprivateBlogRepositoryblogRepository;\n}

添加

@PostMapping(&34;)\npublicResultadd(@RequestBodyBlogModelblogModel){\nblogRepository.save(blogModel);\nreturnResult.success();\n}

我们添加一条数据,标题是:Elasticsearch实战篇:SpringBoot整合ElasticSearch,时间是:2019-03-06。我们来测试,看一下成不成功。

POSThttp://localhost:8080/blog/add

{\n&34;:&34;,\n&34;:&34;\n}

得到响应:

{\n&34;:0,\n&34;:&34;\n}

嘿,成功了。那接下来,我们一下查询方法测试一下。

查询

根据ID查询

@GetMapping(&34;)\npublicResultgetById(@PathVariableStringid){\nif(StringUtils.isEmpty(id))\nreturnResult.error();\nOptional<BlogModel>blogModelOptional=blogRepository.findById(id);\nif(blogModelOptional.isPresent()){\nBlogModelblogModel=blogModelOptional.get();\nreturnResult.success(blogModel);\n}\nreturnResult.error();\n}

测试一下:

ok,没问题。

查询所有

@GetMapping(&34;)\npublicResultgetAll(){\nIterable<BlogModel>iterable=blogRepository.findAll();\nList<BlogModel>list=newArrayList<>();\niterable.forEach(list::add);\nreturnResult.success(list);\n}

测试一下:

GEThttp://localhost:8080/blog/get

结果:

{\n&34;:0,\n&34;:&34;,\n&34;:[\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n}\n]\n}

根据ID修改

@PostMapping(&34;)\npublicResultupdateById(@RequestBodyBlogModelblogModel){\nStringid=blogModel.getId();\nif(StringUtils.isEmpty(id))\nreturnResult.error();\nblogRepository.save(blogModel);\nreturnResult.success();\n}

测试:

POSThttp://localhost:8080/blog/update

{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n}

响应:

{\n&34;:0,\n&34;:&34;\n}

查询一下:

ok,成功!

删除

根据ID删除

@DeleteMapping(&34;)\npublicResultdeleteById(@PathVariableStringid){\nif(StringUtils.isEmpty(id))\nreturnResult.error();\nblogRepository.deleteById(id);\nreturnResult.success();\n}

测试:

DELETEhttp://localhost:8080/blog/delete/fFXTTmkBTzBv3AXCweFS

响应:

{\n&34;:0,\n&34;:&34;\n}

我们再查一下:

删除所有数据

@DeleteMapping(&34;)\npublicResultdeleteById(){\nblogRepository.deleteAll();\nreturnResult.success();\n}

第四部分,搜索

构造数据

为了方便测试,我们先构造数据

Repository查询操作

搜索标题中的关键字

BlogRepositor

List<BlogModel>findByTitleLike(Stringkeyword);

BlogController

@GetMapping(&34;)\npublicResultrepSearchTitle(Stringkeyword){\nif(StringUtils.isEmpty(keyword))\nreturnResult.error();\nreturnResult.success(blogRepository.findByTitleLike(keyword));\n}

我们来测试一下。

POSThttp://localhost:8080/blog/rep/search/title?keyword=java

结果:

{\n&34;:0,\n&34;:&34;,\n&34;:[\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n}\n]\n}

继续搜索:

GEThttp://localhost:8080/blog/rep/search/title?keyword=入门

结果:

{\n&34;:0,\n&34;:&34;,\n&34;:[\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n}\n]\n}

为了验证,我们再换一个关键字搜索:

GEThttp://localhost:8080/blog/rep/search/title?keyword=java入门

{\n&34;:0,\n&34;:&34;,\n&34;:[\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n}\n]\n}

哈哈,有没有觉得很眼熟。

那根据上次的经验,我们正好换一种方式解决这个问题。

@Query(&34;match_phrase\\&34;title\\&34;?0\\&34;)\nList<BlogModel>findByTitleCustom(Stringkeyword);

值得一提的是,官方文档示例代码可能是为了好看,出现问题。

官网文档给的错误示例:

官网示例代码:

官方示例代码

另外,?0代指变量的意思。

@GetMapping(&34;)\npublicResultrepSearchTitleCustom(Stringkeyword){\nif(StringUtils.isEmpty(keyword))\nreturnResult.error();\nreturnResult.success(blogRepository.findByTitleCustom(keyword));\n}

测试一下:

ok,没有问题。

ElasticsearchTemplate

@Autowired\nprivateElasticsearchTemplateelasticsearchTemplate;\n\n@GetMapping(&34;)\npublicResultsearchTitle(Stringkeyword){\nif(StringUtils.isEmpty(keyword))\nreturnResult.error();\nSearchQuerysearchQuery=newNativeSearchQueryBuilder()\n.withQuery(queryStringQuery(keyword))\n.build();\nList<BlogModel>list=elasticsearchTemplate.queryForList(searchQuery,BlogModel.class);\nreturnResult.success(list);\n}

测试:

POSThttp://localhost:8080/blog/search/title?keyword=java入门

结果:

{\n&34;:0,\n&34;:&34;,\n&34;:[\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n},\n{\n&34;:&34;,\n&34;:&34;,\n&34;:&34;\n}\n]\n}

OK,暂时先到这里,关于搜索,我们后面会专门开一个专题,学习搜索。

第五部分,例子

我们写个什么例子,想了很久,那就写一个搜索手机的例子吧!

界面截图

我们先看下最后实现的效果吧

主页效果:

分页效果:

我们搜索“小米”:

我们搜索“1999”:

我们搜索“黑色”:

高级搜索页面:

我们使用高级搜索,搜索:“小米”、“1999”:

高级搜索“小米”、“1999”结果:

上面的并且关系生效了吗?我们试一下搜索“华为”,“1999”:

最后,我们尝试搜索时间段:

看一下,搜索结果吧:

说实话,这个时间搜索结果,我不是很满意,ES的时间问题,我打算在后面花一些时间去研究下。

搭建项目

基于Gradle搭建SpringBoot项目,把我折腾的受不了(如果哪位这方面有经验,可以给我指点指点),这个demo写了很久,那天都跑的好好的,今早上起来,就跑步起来了,一气之下,就改成Maven了。

下面看一下我的依赖和配置

pom.xml片段

<parent>\n<groupId>org.springframework.boot</groupId>\n<artifactId>spring-boot-starter-parent</artifactId>\n<version>2.1.3.RELEASE</version>\n<relativePath/>\n</parent>\n\n<repositories>\n<repository>\n<id>jitpack.io</id>\n<url>https://jitpack.io</url>\n</repository>\n</repositories>\n\n<dependencies>\n<dependency>\n<groupId>org.springframework.boot</groupId>\n<artifactId>spring-boot-starter-data-elasticsearch</artifactId>\n</dependency>\n<dependency>\n<groupId>org.springframework.boot</groupId>\n<artifactId>spring-boot-starter-web</artifactId>\n</dependency>\n\n<dependency>\n<groupId>org.projectlombok</groupId>\n<artifactId>lombok</artifactId>\n<optional>true</optional>\n</dependency>\n<dependency>\n<groupId>org.springframework.boot</groupId>\n<artifactId>spring-boot-starter-test</artifactId>\n<scope>test</scope>\n</dependency>\n\n<dependency>\n<groupId>com.github.fengwenyi</groupId>\n<artifactId>JavaLib</artifactId>\n<version>1.0.7.RELEASE</version>\n</dependency>\n\n<dependency>\n<groupId>org.springframework.boot</groupId>\n<artifactId>spring-boot-starter-webflux</artifactId>\n</dependency>\n\n<dependency>\n<groupId>com.alibaba</groupId>\n<artifactId>fastjson</artifactId>\n<version>1.2.56</version>\n</dependency>\n\n<dependency>\n<groupId>org.apache.httpcomponents</groupId>\n<artifactId>httpclient</artifactId>\n<version>4.5.7</version>\n</dependency>\n\n<dependency>\n<groupId>org.jsoup</groupId>\n<artifactId>jsoup</artifactId>\n<version>1.10.2</version>\n</dependency>\n</dependencies>

application.yml

server:\nport:9090\n\nspring:\ndata:\nelasticsearch:\ncluster-nodes:localhost:9300\ncluster-name:es-wyf\nrepositories:\nenabled:true

PhoneModel

@Data\n@Accessors(chain=true)\n@Document(indexName=&34;,type=&34;)\npublicclassPhoneModelimplementsSerializable{\nprivatestaticfinallongserialVersionUID=-5087658155687251393L;\n\n/*ID*/\n@Id\nprivateStringid;\n\n/*名称*/\nprivateStringname;\n\n/*颜色,用英文分号(;)分隔*/\nprivateStringcolors;\n\n/*卖点,用英文分号(;)分隔*/\nprivateStringsellingPoints;\n\n/*价格*/\nprivateStringprice;\n\n/*产量*/\nprivateLongyield;\n\n/*销售量*/\nprivateLongsale;\n\n/*上市时间*/\n//@DateTimeFormat(pattern=&34;)\n@JsonFormat(pattern=&34;,timezone=&34;)\nprivateDatemarketTime;\n\n/*数据抓取时间*/\n//@DateTimeFormat(pattern=&34;)\n@JsonFormat(pattern=&34;,timezone=&34;)\nprivateDatecreateTime;\n\n}

PhoneRepository

publicinterfacePhoneRepositoryextendsElasticsearchRepository<PhoneModel,String>{\n}

PhoneController

@RestController\n@RequestMapping(value=&34;)\n@CrossOrigin\npublicclassPhoneController{\n\n@Autowired\nprivateElasticsearchTemplateelasticsearchTemplate;\n\n}

后面接口,都会在这里写。

构造数据

我的数据是抓的“华为”和“小米”官网

首先使用httpclient下载html,然后使用jsoup进行解析。

华为为例:

privatevoidhuawei()throwsIOException{\nCloseableHttpClienthttpclient=HttpClients.createDefault();//创建httpclient实例\nHttpGethttpget=newHttpGet(&34;);//创建httpget实例\n\nCloseableHttpResponseresponse=httpclient.execute(httpget);//执行get请求\nHttpEntityentity=response.getEntity();//获取返回实体\n//System.out.println(&34;+EntityUtils.toString(entity,&34;));//指定编码打印网页内容\nStringcontent=EntityUtils.toString(entity,&34;);\nresponse.close();//关闭流和释放系统资源\n\n//System.out.println(content);\n\nDocumentdocument=Jsoup.parse(content);\nElementselements=document.select(&content-v3-plp34;);\nfor(Elementelement:elements){\n//System.out.println(element.text());\nStringjsonStr=element.text();\nList<HuaWeiPhoneBean>list=JSON.parseArray(jsonStr,HuaWeiPhoneBean.class);\nfor(HuaWeiPhoneBeanbean:list){\nStringproductName=bean.getProductName();\nList<ColorModeBean>colorsItemModeList=bean.getColorsItemMode();\n\nStringBuildercolors=newStringBuilder();\nfor(ColorModeBeancolorModeBean:colorsItemModeList){\nStringcolorName=colorModeBean.getColorName();\ncolors.append(colorName).append(&34;);\n}\n\nList<String>sellingPointList=bean.getSellingPoints();\nStringBuildersellingPoints=newStringBuilder();\nfor(StringsellingPoint:sellingPointList){\nsellingPoints.append(sellingPoint).append(&34;);\n}\n\n//System.out.println(&34;+productName);\n//System.out.println(&34;+color);\n//System.out.println(&34;+sellingPoint);\n//System.out.println(&34;);\nPhoneModelphoneModel=newPhoneModel()\n.setName(productName)\n.setColors(colors.substring(0,colors.length()-1))\n.setSellingPoints(sellingPoints.substring(0,sellingPoints.length()-1))\n.setCreateTime(newDate());\nphoneRepository.save(phoneModel);\n}\n}\n}

全文搜索

全文搜索来说,还是相对来说,比较简单,直接贴代码吧:

/**\n*全文搜索\n*@paramkeyword关键字\n*@parampage当前页,从0开始\n*@paramsize每页大小\n*@return{@linkResult}接收到的数据格式为json\n*/\n@GetMapping(&34;)\npublicMono<Result>full(Stringkeyword,intpage,intsize){\n//System.out.println(newDate()+&34;+keyword);\n\n//校验参数\nif(StringUtils.isEmpty(page))\npage=0;//ifpageisnull,page=0\n\nif(StringUtils.isEmpty(size))\nsize=10;//ifsizeisnull,sizedefault10\n\n//构造分页类\nPageablepageable=PageRequest.of(page,size);\n\n//构造查询NativeSearchQueryBuilder\nNativeSearchQueryBuildersearchQueryBuilder=newNativeSearchQueryBuilder()\n.withPageable(pageable)\n;\nif(!StringUtils.isEmpty(keyword)){\n//keywordmustnotnull\nsearchQueryBuilder.withQuery(QueryBuilders.queryStringQuery(keyword));\n}\n\n/*\nSearchQuery\n这个很关键,这是搜索条件的入口,\nelasticsearchTemplate会使用它进行搜索\n*/\nSearchQuerysearchQuery=searchQueryBuilder.build();\n\n//pagesearch\nPage<PhoneModel>phoneModelPage=elasticsearchTemplate.queryForPage(searchQuery,PhoneModel.class);\n\n//return\nreturnMono.just(Result.success(phoneModelPage));\n}

官网文档也是这么用的,所以相对来说,这还是很简单的,不过拆词和搜索策略搜索速度可能在实际使用中要考虑。

高级搜索

先看代码,后面我们再来分析:

/**\n*高级搜索,根据字段进行搜索\n*@paramname名称\n*@paramcolor颜色\n*@paramsellingPoint卖点\n*@paramprice价格\n*@paramstart开始时间(格式:yyyy-MM-ddHH:mm:ss)\n*@paramend结束时间(格式:yyyy-MM-ddHH:mm:ss)\n*@parampage当前页,从0开始\n*@paramsize每页大小\n*@return{@linkResult}\n*/\n@GetMapping(&34;)\npublicMono<Result>search(Stringname,Stringcolor,StringsellingPoint,Stringprice,Stringstart,Stringend,intpage,intsize){\n\n//校验参数\nif(StringUtils.isEmpty(page)||page<0)\npage=0;//ifpageisnull,page=0\n\nif(StringUtils.isEmpty(size)||size<0)\nsize=10;//ifsizeisnull,sizedefault10\n\n//构造分页对象\nPageablepageable=PageRequest.of(page,size);\n\n//BoolQueryBuilder(ElasticsearchQuery)\nBoolQueryBuilderboolQueryBuilder=newBoolQueryBuilder();\nif(!StringUtils.isEmpty(name)){\nboolQueryBuilder.must(QueryBuilders.matchQuery(&34;,name));\n}\n\nif(!StringUtils.isEmpty(color)){\nboolQueryBuilder.must(QueryBuilders.matchQuery(&34;,color));\n}\n\nif(!StringUtils.isEmpty(color)){\nboolQueryBuilder.must(QueryBuilders.matchQuery(&34;,sellingPoint));\n}\n\nif(!StringUtils.isEmpty(price)){\nboolQueryBuilder.must(QueryBuilders.matchQuery(&34;,price));\n}\n\nif(!StringUtils.isEmpty(start)){\nDatestartTime=null;\ntry{\nstartTime=DateTimeUtil.stringToDate(start,DateTimeFormat.yyyy_MM_dd_HH_mm_ss);\n}catch(ParseExceptione){\ne.printStackTrace();\n}\nboolQueryBuilder.must(QueryBuilders.rangeQuery(&34;).gt(startTime.getTime()));\n}\n\nif(!StringUtils.isEmpty(end)){\nDateendTime=null;\ntry{\nendTime=DateTimeUtil.stringToDate(end,DateTimeFormat.yyyy_MM_dd_HH_mm_ss);\n}catch(ParseExceptione){\ne.printStackTrace();\n}\nboolQueryBuilder.must(QueryBuilders.rangeQuery(&34;).lt(endTime.getTime()));\n}\n\n//BoolQueryBuilder(SpringQuery)\nSearchQuerysearchQuery=newNativeSearchQueryBuilder()\n.withPageable(pageable)\n.withQuery(boolQueryBuilder)\n.build()\n;\n\n//pagesearch\nPage<PhoneModel>phoneModelPage=elasticsearchTemplate.queryForPage(searchQuery,PhoneModel.class);\n\n//return\nreturnMono.just(Result.success(phoneModelPage));\n}

不管spring如何封装,查询方式都一样,如下图:

好吧,我们怀着这样的心态去看下源码。

org.springframework.data.elasticsearch.core.query.SearchQuery

这个是我们搜索需要用到对象

publicNativeSearchQueryBuilderwithQuery(QueryBuilderqueryBuilder){\nthis.queryBuilder=queryBuilder;\nreturnthis;\n}

OK,根据源码,我们需要构造这个QueryBuilder,那么问题来了,这个是个什么东西,我们要如何构造,继续看:

org.elasticsearch.index.query.QueryBuilder

注意包名。

啥,怎么又跑到elasticsearch。

你想啊,你写的东西,会让别人直接操作吗?

答案是不会的,我们只会提供API,所有,不管Spring如何封装,也只会通过API去调用。

好吧,今天先到这里。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平