1

SnowballAnalyzerを使用してインデックスに対してクエリを実行しようとしています。正しく機能していないようです。「スターバックス」と入力すると0の結果が返されますが、「スターバックス」と入力すると、名前に「スターバックス」が含まれるすべてのデータが返されます。

通常の検索を行うときは、search_analyzerを使用するために、フィールドを明示的に指定する必要があることを知っています。

_mappingがsnowballindex_analyzerを使用していると言っているのに、snowball search_analyzerについて言及していないのは奇妙ですか?

マッピングスニペット:

name: {
            type: "string",
            search_analyzer : "snowball", 
            index_analyzer : "snowball",
            boost : 1
      },
tags: {
            type: "string",
            search_analyzer : "snowball", 
            index_analyzer : "snowball",
            boost : 4
      }

/ businesses / business/_mappingからのスニペット

name: {type: "string",analyzer: "snowball"},
tags: {type: "string",boost: 4,analyzer: "snowball"}

検索を行うJavaコード:

val response = client.prepareSearch("businesses")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(termQuery("name", term))
        .setFrom(0).setSize(100).setExplain(true)
        .execute()
        .actionGet();
4

2 に答える 2

2

で指定された用語termQueryは分析されず、そのまま使用されます。単語Starbucksは用語として索引付けされてstarbuckいるため、いくつかの結果を取り戻すことができます。用語を検索しているときStarbucks、インデックスにそのような用語はなく、結果は得られません。代わりにクエリを使用することをお勧めしtextます。これにより、用語の分析が実行されます。

val response = client.prepareSearch("businesses")
    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
    .setQuery(text("name", term))
    .setFrom(0).setSize(100).setExplain(true)
    .execute()
    .actionGet();
于 2012-12-06T00:33:30.803 に答える
0

また、multi_matchクエリを実行して解決しました。これにより、検索アナライザーが適切に適用されたようです。

val customQuery = customScoreQuery(
        filteredQuery(
            multiMatchQuery("Gamestop".toLowerCase())
                .field("tags")
                .field("name"), 
            geoDistanceFilter("location")
            .point(40.76405282025, -73.972994269042)
            .distance(10, DistanceUnit.KILOMETERS)
        )
     )
     .script("customscript")
     .lang("native")
     .param("lat",40.76405282025)
     .param("lon",-73.972994269042)

    val response = client.prepareSearch("businesses")
        .setSearchType(SearchType.QUERY_AND_FETCH)
        .setQuery(customQuery)
        .setFrom(0).setSize(100).setExplain(true)
        .execute()
        .actionGet();

これは、地理距離フィルターを使用して、カスタムスコアクエリをフィルター処理されたマルチマッチクエリと組み合わせる良い例でもあります。

于 2012-12-06T15:50:01.800 に答える