【发布时间】:2019-04-01 14:42:33
【问题描述】:
我们在 Elasticsearch 5.6.6 服务器上使用 Hibernate Search 5.10.3.Final。
在创建要传递给 FullTextSession::createFullTextQuery 的模糊查询时,我设置了 editDistance 和 prefixLength,但我从日志中注意到发送到 Elasticsearch 的实际查询不包含 prefixLength。
这段代码是从多个单独的方法中提取的,但这是基本的工作流程:
QueryBuilder qb = fts.getSearchFactory()
.buildQueryBuilder()
.forEntity(Vendor.class)
.get();
BooleanJunction namesBool = qb.bool();
String field = "vendorNames.vendorName";
String token = "rooster";
int editDistance = getEditDistance(token); //returns 1 for "rooster"
int prefixLength = getPrefixLength(token); //returns 1 for "rooster"
namesBool.must(
qb.keyword()
.fuzzy() //returns FuzzyContext
.withEditDistanceUpTo(editDistance)
.withPrefixLength(prefixLength)
.onField(field)
.matching(token)
.createQuery()
);
// ...
// calling FullTextSession::createFullTextQuery
当术语“公鸡”通过此方法发送时,它的 editDistance(模糊度)为 1,prefixLength 为 1。
检查日志并查看发送到 ES 的内容,我希望在“fuzziness”正下方看到“prefix_length”,但它不存在:
{
"query": {
"bool": {
"must": {
"match": {
"vendorNames.vendorName": {
"query": "rooster",
"fuzziness": 1
}
}
}
}
}
- 为什么 FuzzyContext 允许设置 prefixLength 但不使用它?
- 尝试包含 prefixLength 是否真的值得 ES 性能提升(我测试了直接对 ES 的 REST 查询调用,无论有无 prefixLength,但没有注意到响应时间差异)?
- 如何让 prefixLength 包含在发送到 ES 的实际查询中?
【问题讨论】:
标签: java elasticsearch hibernate-search