Hibernate Search 中文操作指南

22. Troubleshooting

22.1. Finding out what is executed under the hood

对于搜索查询,可以通过调用 toString()queryString() 来获取 SearchQuery object 的人类可读表示形式。此外,可使用日志: org.hibernate.search.query 会在 TRACE 级别记录每个查询,然后执行该查询。

有关被执行内容的更一般信息,请依赖于记录器:

22.2. Loggers

在调试使用 Hibernate Search 的应用时,以下是几个可能派的上用场的记录器:

org.hibernate.search.query

适用于所有后端。

在执行之前,以 TRACE 级别记录每个搜索查询。

org.hibernate.search.elasticsearch.request

仅适用于 Elasticsearch 后端。

在执行后,以 DEBUGTRACE 级别记录请求发送到 Elasticsearch 的情况。所有可用的请求和响应信息都被记录:方法、路径、执行时间、状态代码,以及完整的请求和响应。

使用 DEBUG 级别仅记录非成功请求(状态代码与 2xx 不同),或使用 TRACE 级别记录每个请求。

您可以使用 configuration property为请求和响应启用漂亮打印(换行和缩进)。

org.hibernate.search.backend.lucene.infostream

仅适用于 Lucene 后端。

TRACE 级别记录卢森内部组件的低级跟踪信息。

仅启用此记录器的_TRACE_级别不够:您还必须使用 configuration property启用信息流。

22.3. Frequently asked questions

22.3.1. Unexpected or missing documents in search hits

当某些文档意外匹配或不匹配查询时,你需要有关正在执行的确切查询以及索引内容的信息。

要确切了解正在执行的查询是什么,请参见 Finding out what is executed under the hood

要检查索引内容:

  1. 对于 Elasticsearch 后端,可以使用 Hibernate Search 或直接使用 REST API 运行更简单的查询。

  2. 对于 Lucene 后端,可以使用 Hibernate Search 或 use the Luke toolLucene binary packages的一部分)运行更简单的查询。

22.3.2. Unsatisfying order of search hits when sorting by score

当按分数排序时,如果文档按预期的顺序出现,这意味着某些文档的分数比你想要的更高或更低。

了解这些分数的最佳方法只是让后端解释分数是如何计算的。返回的解释将包括对特定文档的分数如何计算的人类可读描述。

无论使用哪种 API,解释在性能方面相当昂贵:仅将其用于调试目的。

有两种方法可检索说明:

  1. 如果您对特定实体感兴趣并且知道其标识符:对查询使用 explain(…​) 方法。请参阅 explain(…​): Explaining scores

  2. 如果您只需要了解所有热门结果的解释:请使用 _explanation_投影。请参阅 here for Lucenehere for Elasticsearch

22.3.3. Search query execution takes too long

当搜索查询执行时间过长时,你可能需要更多有关具体执行时间和具体执行内容的信息。

要了解查询执行花费了多长时间,对搜索结果使用 took() method

要确切了解正在执行的查询是什么,请参见 Finding out what is executed under the hood