2016-06-23 3 views
0

elasticsearch集計にhereのようなレールアプリを作成しようとしています。私は現在のelasticsearch 2.3で動作するように更新しました。 javascriptは正常に機能しますが、それ以上のチェックボックスを1つ選択すると、フィルタは何も返しません。チェックボックスを処理しないアプリhereとは異なるコードです。私は何が欠けていますか?elasticsearchファセットナビゲーション

フィルタは次のようになります。

__set_filters = lambda do |key, f| 
    @search_definition[:post_filter][:and] ||= [] 
    @search_definition[:post_filter][:and] |= [f] 

    @search_definition[:aggregations][key.to_sym][:filter][:bool][:must] ||= [] 
    @search_definition[:aggregations][key.to_sym][:filter][:bool][:must] |= [f] 
    end 

if options[:category] 
    f = { term: { "categories,name" => options[:category] } } 
    __set_filters.(:location, f) 
end 

if options[:location] 
    f = { term: { "location,name" => options[:location] } } 
    __set_filters.(:categories, f) 
end 
+0

カテゴリ名の例を挙げてください。彼らのスペースはありますか?標準的な分析装置を使用しましたか? – bkunzi01

答えて

1

それは、特定のフィールドのために、あなたの入力の完全一致を求めているので、弾性検索に新たな頭痛を引き起こすことができるフィルタを使用しかし、ときに最初のインデックスのもの(特に文字列異なるアナライザを指定しなかった場合は標準のアナライザを使用します)、フィールドを複数の文字列に分割し、ドキュメントがトークンとして参照します。たとえば、アナライザを指定せずに「Oyster Bay」という町に索引付けすると、実際にはこのフィールドが2つのトークン「Oyster」と「Bay」に分割されます。このフィールドでフィルターを使用して "オイスターベイ"に入れようとすると、完全一致と見なされず返されます。この問題を回避するために、クエリ上のフィルタを使用して、マッピング内のそれぞれのフィールドに「not_analyzed」インデックスを追加することをお勧めします。

+1

非常に参考になりましたありがとう –