13

私は ElasticSearch を使用していますが、ファセットを使用して結果の統計情報、より具体的には、結果で最も言及されている人を取得できるかどうか疑問に思っています。その情報を含むフィールドが既にあります。しかし現在、ファセットの結果は、複数の単語でグループ化したいときに、そのフィールドのデータを用語ごとに分割しています。

つまり、ユーザーが John を検索した場合、次のようなデータを取得したいと考えています。

   {
    [...]
    "facets" : {

        "topPeople" : {
        "_type" : "terms",
        "missing" : 0,
        "total" : 1739884,
        "other" : 1705319,
        "terms" : [ {
           "term" : "John Smith",
           "count" : 13954
          }, {
           "term" : "John Snow",
           "count" : 1432
          }, {
           "term" : "John Baird",
           "count" : 770
          }]
       }
   }

代わりに、ElasticSearch は結果を用語ごとに分割し、次のようなものを返します。

   {
    [...]
    "facets" : {

        "topPeople" : {
        "_type" : "terms",
        "missing" : 0,
        "total" : 1739884,
        "other" : 1705319,
        "terms" : [ {
           "term" : "John",
           "count" : 1739884
          }, {
           "term" : "Smith",
           "count" : 13954
          }, {
           "term" : "Snow",
           "count" : 1432
          }]
       }
   }

インデックスを分析しないように設定すると、ElasticSearch は単語の完全な文字列を返す必要があることをどこかで読みました。ただし、ユーザーがフィールドで検索できるようにしたいです。フィールドを複製して分析されていないフィールドを持つことは避けたいと思います。ElasticSearch でフィールドごとにグループ化する方法はありますか?

現在、次のファセット クエリを使用しています。

{
 "query" : {
   [...]
 },
 "facets" : {
   "topPeople" : {
     "terms" : {
        "field" : "people",
        "size" : 3
      }
    }
  }
}
4

1 に答える 1

14

あなたは正しい軌道に乗っています。求めていることを行うために分析されていないインデックスが必要ですが、ユーザーがフィールドで検索する方法を犠牲にする必要はありません。ここでの答え (バージョン < 1.x の場合) はMulti Field Typeです。あなたの例では、マッピングを次のようにする必要があります。

    "topPeople" : {
        "type" : "multi_field",
        "fields" : {
            "topPeople" : {"type" : "string", "index" : "analyzed"},
            "raw" : {"type" : "string", "index" : "not_analyzed"}
        }
    }

検索すると で検索を続行できますがtopPeople、ファセットすると でファセットしtopPeople.rawます。

于 2013-06-24T14:19:00.513 に答える