如何解决使用 RestHighLevelClient 执行弹性搜索查询的最佳方法是什么
尝试使用 CompletionSuggester 来实现自动完成功能,通过 Java 的 RestHighLevelClient 有不同的方式来实现完成提示,想了解以下这些方法之间有什么区别(在性能/查询执行速度方面)
1:使用 CompletionSuggestionBuilder(耗时 8 毫秒):
val completionSuggestionBuilder = SuggestBuilders.completionSuggestion("field_name").prefix("ban",Fuzziness.ONE).size(10)
val suggestBuilder = SuggestBuilder().addSuggestion("find_by_prefix",completionSuggestionBuilder)
val searchSourceBuilder = SearchSourceBuilder().suggest(suggestBuilder)
val searchRequest = SearchRequest("locations").source(searchSourceBuilder)
val searchResponse = restClient.search(searchRequest,RequestOptions.DEFAULT)
2:使用 SimpleQueryString(耗时 30 毫秒):
val query = """{"suggest":{"find_by_prefix":{"prefix":"Ban","completion":{"field":"field_name","size":10,"fuzzy":{"fuzziness":1},"contexts":{"locationType":[{"context":"AREA","boost":1},{"context":"CITY","boost":1}],"geolocation":[{"lon":77.6279354,"lat":12.9331699,"precision":"30km","boost":2}]}}}}}"""
val searchSourceBuilder = SearchSourceBuilder().query(QueryBuilders.simpleQueryStringQuery(query))
val searchRequest = SearchRequest("locations").source(searchSourceBuilder)
val searchResponse = restClient.search(searchRequest,RequestOptions.DEFAULT)
解决方法
根据您的应用程序和您的需求,它可能会有所不同,通常取决于许多变量,例如分片复制的数量或索引级别的索引映射等,因为 Elastic 在 Apache-Lucene 上构建的地方通常是叶子或复合查询对于简单使用具有更好的性能,但是如果您需要复杂的结果,最好的方法是使用聚合此外,如果您想在应用程序级别处理查询语法,最好的方法是使用字符串本机查询作为示例,如果您有 Spring Boot 应用程序最好的方法是绑定和创建你的字符串 quires 而不是使用默认存储库,考虑下面的例子
@Query("{\"bool\":" +
"{\"must\" :" +
"[" + "" +
"{\"query_string\":{ \"query\" : \"?0\",\"fields\" : [ \"parentKnowledgeGroupId\" ] }}," +
"{\"query_string\":{ \"query\" : \"?1\",\"fields\" : [ \"knowledgeGroupId\" ]}}," +
"{\"query_string\":{ \"query\" : \"?2\",\"fields\" : [ \"content\" ]}}," +
"{\"query_string\":{ \"query\" : \"?3\",\"fields\" : [ \"courseType\" ]}}," +
"]" +
"}" +
"}")
ElasticModelSequence SearchCore(@Param("parentKnowledgeGroupId") String parentKnowledgeGroupId,@Param("knowledgeGroupId") String knowledgeGroupId,@Param("term") String term,@Param("courseType") ElasticModelSequence.CourseType courseType);
或者更简单的
@Query("{\"term\": {\"sequenceId\" : \"?0\"} " + "}")
ElasticModelSequence findBySequenceId(@Param("SequenceId")String SequenceId);
您只需要将它们添加到您的 Elasticsearch 存储库类中,该类从 Elasticsearch 存储库扩展而来,例如
@Repository
public interface YourRepositoryName extends ElasticsearchRepository<yourmodelname,String>
对于弹簧箱,您可以在 Here 中找到更多信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。