【问题标题】:What is the best way to execute elasticsearch queries with RestHighLevelClient使用 RestHighLevelClient 执行弹性搜索查询的最佳方法是什么
【发布时间】:2021-08-17 07:15:53
【问题描述】:

尝试使用 CompletionSuggester 实现自动完成功能,通过 Java 的 RestHighLevelClient 实现完成建议的方法有多种,想了解以下这些方法之间是否有任何区别(在性能/查询执行速度方面)

1:使用 CompletionSuggestionBuilder(耗时 8mill-sec):

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)

【问题讨论】:

  • 由于您是通过网络执行操作,因此您在代码中所做的任何事情都无关紧要,并且比实际的网络调用要快几个数量级。也就是说:无论是更容易向您、未来您和您团队中的其他开发人员扩展的东西。就个人而言,我会选择建设者

标签: java elasticsearch resthighlevelclient


【解决方案1】:

根据您的应用程序和您的需求,它可能会有所不同,并且通常取决于许多变量,例如分片复制的数量或索引级别的索引映射等,因为 Elastic 建立在 Apache-Lucene 上的地方通常是叶子或复合查询对于简单的使用具有更好的性能,但是如果您需要复杂的结果,最好的方法是使用聚合此外,如果您想在应用程序级别处理查询语法,最好的方法是使用字符串本机查询作为示例,如果您有 spring boot 应用程序最好的方法是绑定和创建你的字符串查询,而不是使用默认存储库,考虑下面的例子

    @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 找到更多信息。

【讨论】:

  • 感谢 Mikael Amidi 非常感谢您的帮助。
  • 欢迎您!如果您得到想要的答案,如果您接受我的解决方案作为答案,我将不胜感激
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 2016-08-21
  • 1970-01-01
相关资源
最近更新 更多