2017-04-17 2 views
0

でカスタム・アナライザでキーワード文字列型を作成します。 " - >" San Francisco "、" Boston "、" New York "私はキーワードの種類として、インデックスではなく、特殊なカンマアナライザで希望の文字列を持っている5.3.0

は、バケットで分割することができるように、インデックスとアグリゲーションの両方を同時に行う必要があります。5.0.0以前では、次のように動作しました: 設定:

{ 
    'settings': { 
     'analysis': { 
      'tokenizer': { 
       'comma': { 
        'type': 'pattern', 
        'pattern': ',' 
       } 
      }, 
      'analyzer': { 
       'comma': { 
        'type': 'custom', 
        'tokenizer': 'comma' 
       } 
      } 
     }, 
    }, 
} 

とfo llowingマッピング:5.3.0中とアナライザ上で今

{ 
    'city': { 
     'type': 'string', 
     'analyzer': 'comma' 
    }, 
} 

はもはやキーワードの種類のための有効なプロパティではありませんし、私の理解では、私がここにkeywordタイプをしたいということです。カスタムアナライザを使用して、集計可能で索引付けされた検索可能なテキスト型を指定するにはどうすればよいですか?

+0

、 'keyword'フィールドは、現在[正規化](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-normalizers.html)を有することができます、しかし、特定のトークンフィルタと文字フィルタを使用しますが、トークナイザは使用しません。これはアプローチではありません。その文字列をESに送る前にクライアント側で分割する方法はありますか? – Val

答えて

1

multifieldsを使用すると、検索と集計の2つの異なる方法で同じフィールドにインデックスを付けることができます。

また、trimのフィルタを追加することをお勧めします。より良い検索に役立てるために生成されたトークンを小文字にしてください。

マッピング

PUT commaindex2 
    { 
     "settings": { 
      "analysis": { 
       "tokenizer": { 
        "comma": { 
         "type": "pattern", 
         "pattern": "," 
        } 
       }, 
       "analyzer": { 
        "comma": { 
         "type": "custom", 
         "tokenizer": "comma", 
         "filter": ["lowercase", "trim"] 
        } 
       } 
      } 
     }, 
     "mappings": { 
      "city_document": { 
       "properties": { 
        "city": { 
         "type": "keyword", 
         "fields": { 
          "city_custom_analyzed": { 
           "type": "text", 
           "analyzer": "comma", 
           "fielddata": true 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

インデックス文書

POST commaindex2/city_document 
{ 
    "city" : "san fransisco, new york, london" 
} 

検索クエリ

POST commaindex2/city_document/_search 
{ 
    "query": { 
     "bool": { 
      "must": [{ 
       "term": { 
        "city.city_custom_analyzed": { 
         "value": "new york" 
        } 
       } 
      }] 
     } 
    }, 
    "aggs": { 
     "terms_agg": { 
      "terms": { 
       "field": "city", 
       "size": 10 
      } 
     } 
    } 
} 

注:

インデックス付きフィールドでaggsを実行する場合、バケット内の各都市をカウントする場合と同様に、city.city_custom_analyzedフィールドで用語集計を実行できます。

POST commaindex2/city_document/_search 
{ 
    "query": { 
     "bool": { 
      "must": [{ 
       "term": { 
        "city.city_custom_analyzed": { 
         "value": "new york" 
        } 
       } 
      }] 
     } 
    }, 
    "aggs": { 
     "terms_agg": { 
      "terms": { 
       "field": "city.city_custom_analyzed", 
       "size": 10 
      } 
     } 
    } 
} 

あなたがES 5.3を使用しているので、これは

+0

'city'フィールドで用語集合を実行するとどうなりますか?あなたはおそらく別々に各都市を取得するのではないでしょうか? – Val

+0

そうですね、代わりにcity.city_custom_analyzedフィールドで実行できます。彼は集計をどこで実行したいか明確には言及していない。その場合、なぜ彼はキーワードが必要なのか、彼はカスタムアナライザを適用して、マルチフィールドを避けることができます。それまで彼は彼がどんな分野でも選ぶことができる。私はポストを更新します。ありがとう – user3775217

1

を役に立てば幸い、私は、インデックス作成時に、あなたのフィールドを分割するために取り込みパイプラインを使用して、別のアプローチを示唆しています。

PUT _ingest/pipeline/city-splitter 
{ 
    "description": "City splitter", 
    "processors": [ 
    { 
     "split": { 
     "field": "city", 
     "separator": "," 
     } 
    }, 
    { 
     "foreach": { 
     "field": "city", 
     "processor": { 
      "trim": { 
      "field": "_ingest._value" 
      } 
     } 
     } 
    } 
    ] 
} 

その後、あなたはインデックス新しいドキュメントことができます。

PUT cities/city/1?pipeline=city-splitter 
{ "city" : "San Francisco, Boston, New York" } 

とは最終的に、あなたは/ソートにcityを検索し、都市は、クライアントアプリケーションに分割されていたかのようにフィールドcity.keywordの集約を実行することができます:5.2以上で

POST cities/_search 
{ 
    "query": { 
    "match": { 
     "city": "boston" 
    } 
    }, 
    "aggs": { 
    "cities": { 
     "terms": { 
     "field": "city.keyword" 
     } 
    } 
    } 
} 
+0

これで運がいいですか? – Val

関連する問題