0

这是我现在的做法:

.. .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了,但它似乎只适用于一个字段。有没有其他方法可以实现这种搜索?

4

1 回答 1

1

不幸的是,多重匹配不支持查询通配符。而不是使用多重匹配,听起来您可能想看看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的工具在所需字段上生成这些部分匹配。寻找使用不同类型的分析器来获得更好的搜索索引,而不是试图让查询构建器屈服于你的意愿。

于 2015-07-13T17:38:45.443 回答