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たが、1つのフィールドでしか機能しないようです..そのような検索を実装する他の方法はありますか?

4

1 に答える 1

1

残念ながら、マルチマッチはクエリ ワイルドカードをサポートしていません。multimatch を使用する代わりに、パターン マッチングの柔軟性が高く、複数のフィールドに対して実行できる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 に答える