多个字段的短语匹配
Phrase matching over multiple fields
这是我现在的做法:
..
.setQuery(
filteredQuery(
multiMatchQuery(String.format("*%s*", query), "name", "address", "phone")
.type(MultiMatchQueryBuilder.Type.CROSS_FIELDS),
geoDistanceFilter("location")
.distance(radius, DistanceUnit.KILOMETERS)
.geoDistance(GeoDistance.PLANE)
.point(latitude, longitude)
)
)
..
问题是它不搜索部分短语或部分单词..即使使用通配符..
我找到了matchPhraseQuery
,但它似乎只适用于一个字段。有没有其他方法可以实现这种搜索?
很遗憾,多重匹配不支持查询通配符。与其使用多重匹配,听起来您可能想看看 Query String Query,它具有更多的模式匹配灵活性,并且可以 运行 针对多个字段。 Query String 非常强大,因为它为您提供了 Lucene 查询语言供您使用。它的 DSL 看起来像:
{
"query_string" : {
"fields" : ["name", "address", "phone"],
"query" : "*query*"
}
}
并且在 Java 中,大致如下:
..
.setQuery(
filteredQuery(
.queryString("*test*").field("name").field("phone").field("address"),
geoDistanceFilter("location")
.distance(radius, DistanceUnit.KILOMETERS)
.geoDistance(GeoDistance.PLANE)
.point(latitude, longitude)
)
)
..
搜索时使用通配符和模式匹配不鼓励,因为它们的计算成本很高。您应该尝试查看这些模糊搜索情况的索引时间解决方案,使用 NGram Tokenizer 之类的东西在必填字段上产生这些部分匹配。考虑使用不同类型的分析器来获得更好的搜索索引,而不是试图让查询构建器屈服于您的意愿。
这是我现在的做法:
..
.setQuery(
filteredQuery(
multiMatchQuery(String.format("*%s*", query), "name", "address", "phone")
.type(MultiMatchQueryBuilder.Type.CROSS_FIELDS),
geoDistanceFilter("location")
.distance(radius, DistanceUnit.KILOMETERS)
.geoDistance(GeoDistance.PLANE)
.point(latitude, longitude)
)
)
..
问题是它不搜索部分短语或部分单词..即使使用通配符..
我找到了matchPhraseQuery
,但它似乎只适用于一个字段。有没有其他方法可以实现这种搜索?
很遗憾,多重匹配不支持查询通配符。与其使用多重匹配,听起来您可能想看看 Query String Query,它具有更多的模式匹配灵活性,并且可以 运行 针对多个字段。 Query String 非常强大,因为它为您提供了 Lucene 查询语言供您使用。它的 DSL 看起来像:
{
"query_string" : {
"fields" : ["name", "address", "phone"],
"query" : "*query*"
}
}
并且在 Java 中,大致如下:
..
.setQuery(
filteredQuery(
.queryString("*test*").field("name").field("phone").field("address"),
geoDistanceFilter("location")
.distance(radius, DistanceUnit.KILOMETERS)
.geoDistance(GeoDistance.PLANE)
.point(latitude, longitude)
)
)
..
搜索时使用通配符和模式匹配不鼓励,因为它们的计算成本很高。您应该尝试查看这些模糊搜索情况的索引时间解决方案,使用 NGram Tokenizer 之类的东西在必填字段上产生这些部分匹配。考虑使用不同类型的分析器来获得更好的搜索索引,而不是试图让查询构建器屈服于您的意愿。