JsonData.fromJson(String.valueOf(System.currentTimeMillis())) 出现问题
JsonData.fromJson(“now”)出现问题
今天在做时间衰减函数的时候发现一个问题,搞了我好久没有解决,后面查看了官网文档才发现,这部分代码目前仅支持半手动挡或者手动挡的实现,还没有完全实现自动挡呢,这就让我非常苦恼,没得办法,只能使用半原生的方式去解决JsonData.from解决日期的问题。
java">co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [search_phase_execution_exception] all shards failed\r\n\tat co.elastic.clients.transport.rest_client.RestClientTransport.getHighLevelResponse(RestClientTransport.java:334)\r\n\tat co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:154)\r\n\tat co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1882)\r\n\tat co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1899)\r\n\tat com.tom.elasticsearchserver.service.impl.BusinessWeeklyArticleServiceImpl.searchBySplitWord(BusinessWeeklyArticleServiceImpl.java:190)\r\n\tat com.tom.elasticsearchserver.service.impl.BusinessWeeklyArticleServiceImpl.search(BusinessWeeklyArticleServiceImpl.java:85)\r\n\tat com.tom.elasticsearchserver.controller.BusinessWeeklyArticleController.search(BusinessWeeklyArticleController.java:42)\r\n\tat jdk.internal.reflect.GeneratedMethodAccessor117.invoke(Unknown Source)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)\r\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166)\r\n\tat org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:90)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:41002)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:833)\r\n
原始代码
java"> private SearchResponse<Map> searchBySplitWord(PageQueryParam<PageQueryDTO> pageQueryParam) {
SearchResponse<Map> searchResponse;
try {
searchResponse = elasticsearchClient.search(srBuilder -> srBuilder
.index("business-weekly-article-alias")
.minScore(SystemConstant.MIN_SCORE)
// MultiMatch 查找:对输入内容先分词再查询。
.query(builder -> builder
.functionScore(functionScoreQueryBuilder -> functionScoreQueryBuilder
.query(queryBuilder -> queryBuilder
.disMax(disMaxQueryBuilder -> disMaxQueryBuilder
.boost(1.2F)
.tieBreaker(0.7)
.queries(queryListBuilder -> queryListBuilder
.multiMatch(multiMatchQueryBuilder -> multiMatchQueryBuilder
.fields("keywords^20", "title^15", "content^5", "author^5", "smallTitle^15")
.query(pageQueryParam.getParam().getKeywords())
.type(TextQueryType.BestFields)
.tieBreaker(0.7)
.minimumShouldMatch("3<90%")
)
)
))
.boostMode(FunctionBoostMode.Sum)
.scoreMode(FunctionScoreMode.Sum)
.functions(functionQueryBuilder -> functionQueryBuilder
.gauss(decayFunction -> decayFunction
.field("createTime")
.placement(placementBuilder -> placementBuilder
.origin(JsonData.fromJson(String.valueOf(System.currentTimeMillis())))
.offset(JsonData.fromJson("30d"))
.scale(JsonData.fromJson("9000d"))
.decay(0.5)
)
)
.weight(20D)
))
)
// 高亮查询
.highlight(highlightBuilder -> highlightBuilder
.preTags("<font color='red'>")
.postTags("</font>")
.requireFieldMatch(false) //多字段时,需要设置为false
.fields("keywords", highlightFieldBuilder -> highlightFieldBuilder)
.fields("title", highlightFieldBuilder -> highlightFieldBuilder)
.fields("content", highlightFieldBuilder -> highlightFieldBuilder.fragmentSize(1000).numberOfFragments(0))
.fields("author", highlightFieldBuilder -> highlightFieldBuilder)
.fields("smallTitle", highlightFieldBuilder -> highlightFieldBuilder)
)
.from(pageQueryParam.getPageNo() * pageQueryParam.getPageSize())
.size(pageQueryParam.getPageSize())
.sort(sortOptionsBuilder -> sortOptionsBuilder
.field(fieldSortBuilder -> fieldSortBuilder
.field("_score").order(SortOrder.Desc)
/*.field("publishedAt").order(SortOrder.Desc)*/))
, Map.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
return searchResponse;
}
这段代码会出现日期解析的问题,不能使用这种方式解决
java">.placement(placementBuilder -> placementBuilder
.origin(JsonData.fromJson(String.valueOf(System.currentTimeMillis())))
.offset(JsonData.fromJson("30d"))
.scale(JsonData.fromJson("9000d"))
.decay(0.5)
)
如果使用JsonData.fromJson(“now”)同样也会报错,只能改成这样子才能解决这个问题。
java">private SearchResponse<Map> searchBySplitWord(PageQueryParam<PageQueryDTO> pageQueryParam) {
SearchResponse<Map> searchResponse;
// 没办法,这部分代码目前只能挂手动档,自动挡处理不了,后面能挂自动挡了再修改过来就行
Reader queryJson = new StringReader(
"{\n" +
// " \"decay\": 0.5,\n" +
" \"offset\": \"30d\",\n" +
" \"scale\": \"9000d\",\n" +
" \"origin\": \"now\"\n" +
" }");
try {
searchResponse = elasticsearchClient.search(srBuilder -> srBuilder
.index("business-weekly-article-alias")
.minScore(SystemConstant.MIN_SCORE)
// MultiMatch 查找:对输入内容先分词再查询。
.query(builder -> builder
.functionScore(functionScoreQueryBuilder -> functionScoreQueryBuilder
.query(queryBuilder -> queryBuilder
.disMax(disMaxQueryBuilder -> disMaxQueryBuilder
.boost(1.2F)
.tieBreaker(0.7)
.queries(queryListBuilder -> queryListBuilder
.multiMatch(multiMatchQueryBuilder -> multiMatchQueryBuilder
.fields("keywords^20", "title^15", "content^5", "author^5", "smallTitle^15")
.query(pageQueryParam.getParam().getKeywords())
.type(TextQueryType.BestFields)
.tieBreaker(0.7)
.minimumShouldMatch("3<90%")
)
)
))
.boostMode(FunctionBoostMode.Sum)
.scoreMode(FunctionScoreMode.Sum)
.functions(functionQueryBuilder -> functionQueryBuilder
.gauss(decayFunction -> decayFunction
.field("createTime")
.placement(placementBuilder -> placementBuilder
.withJson(queryJson)
.origin(JsonData.fromJson(String.valueOf(System.currentTimeMillis())))
.offset(JsonData.fromJson("30d"))
.scale(JsonData.fromJson("9000d"))
.decay(0.5)
)
)
.weight(20D)
))
)
// 高亮查询
.highlight(highlightBuilder -> highlightBuilder
.preTags("<font color='red'>")
.postTags("</font>")
.requireFieldMatch(false) //多字段时,需要设置为false
.fields("keywords", highlightFieldBuilder -> highlightFieldBuilder)
.fields("title", highlightFieldBuilder -> highlightFieldBuilder)
.fields("content", highlightFieldBuilder -> highlightFieldBuilder.fragmentSize(1000).numberOfFragments(0))
.fields("author", highlightFieldBuilder -> highlightFieldBuilder)
.fields("smallTitle", highlightFieldBuilder -> highlightFieldBuilder)
)
.from(pageQueryParam.getPageNo() * pageQueryParam.getPageSize())
.size(pageQueryParam.getPageSize())
.sort(sortOptionsBuilder -> sortOptionsBuilder
.field(fieldSortBuilder -> fieldSortBuilder
.field("_score").order(SortOrder.Desc)
/*.field("publishedAt").order(SortOrder.Desc)*/))
, Map.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
return searchResponse;
}
总结一下,es如果遇到问题,不要直接上去硬刚,看看能不能使用原生的方式解决。