大家好,今天给各位分享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去调用。
好吧,今天先到这里。
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!
