1

私はしばらくエラスティック検索を使用してきましたが、特定の開始日 (start_at) に一致するイベントを検索する必要があるという障害にぶつかりました。フィールドに次のようにインデックスを付けました


mapping do
    indexes :name,    :type => 'string', :analyzer => 'snowball'
    indexes :description, :type => 'string', :analyzer => 'snowball'
    indexes :start_at, :type => 'date'
    indexes :end_at, :type => 'date'
    indexes :tag_list, :type => 'string', :analyzer => 'snowball'
    indexes :lat_lon, :type => 'geo_point'
    indexes :user_details, :type => 'string'    
  end



  def to_indexed_json
    to_hash.merge({
      :user_details => (user ? user.to_index : nil),
      :artist_details => (artists ? artists.each{|artist| artist.to_index }: nil),
      :primary_genre => (genre ? genre.name : nil),
      :lat_lon => [lat, lng].join(',')
    }).to_json
  end

だから私が打つとき


 Tire.search('events') do 
    # ignore search query keywords
    filter range: {start_at: {gte: Date.today, lt: Date.tomorrow}}
 end

何も返しませんが、単一の範囲でうまく機能します。あれは


 Tire.search('events') do 
    # ignore search query keywords
    filter range: {start_at: {gte: Date.today}}
 end

start_at と end_at を日付にするイベント マッピング用の Elasticsearch のインデックスを作成しました。そうしないと、用語の一致が実行されますが、このようなものは答えになりません。


Tire.search('events') do
  query do
    string "start_at: #{Date.today}"
 end
end

これは文字列の一致を実行するため、トークナイザーは 2012、05、16 に分割され、2012 と 16 以降は複数の領域で一致する可能性があるため、すべての一致が返されるため、すべてのレコードが返されます。

私は非常に基本的な何かが欠けていることを知っています。これについて何か助けていただければ幸いです。

アップデート



Event.find_all_by_start_at(Date.tomorrow + 1.day).size
  Event Load (0.7ms)  SELECT `events`.* FROM `events` WHERE `events`.`start_at` = '2012-05-19'
 => 1 

というわけで、その日はイベントがあります。今、エラスティック検索で実行すると


ruby-1.9.2-p180 :024 > Tire.search('events') do
ruby-1.9.2-p180 :025 >     filter :range, :start_at => {gte: Date.tomorrow + 1.days, lt: Date.tomorrow + 2.days}
ruby-1.9.2-p180 :026?>   end

ruby-1.9.2-p180 :029 > x.to_curl
 => "curl -X GET \"http://localhost:9200/events/_search?pretty=true\" -d '{\"filter\":{\"range\":{\"start_at\":{\"gte\":\"2012-05-19\",\"lt\":\"2012-05-20\"}}}}'" 

{"events":{"event":{"properties":{"allow_comments":{"type":"boolean"},"artist_details":{"type":"string"},"artist_id":{"type":"long"},"city":{"type":"string"},"comments_count":{"type":"long"},"confirm":{"type":"boolean"},"created_at":{"type":"date","format":"dateOptionalTime"},"description":{"type":"string","analyzer":"snowball"},"end_at":{"type":"string"},"event_attendees_count":{"type":"long"},"event_content_type":{"type":"string"},"event_file_name":{"type":"string"},"event_file_size":{"type":"long"},"genre_id":{"type":"long"},"hits":{"type":"long"},"id":{"type":"long"},"interview":{"type":"boolean"},"lat":{"type":"double"},"lat_lon":{"type":"geo_point"},"lng":{"type":"double"},"location":{"type":"string"},"name":{"type":"string","analyzer":"snowball"},"online_tix":{"type":"boolean"},"primary_genre":{"type":"string"},"private":{"type":"boolean"},"start_at":{"type":"string"},"state":{"type":"string"},"tag_list":{"type":"string","analyzer":"snowball"},"updated_at":{"type":"date","format":"dateOptionalTime"},"user_details":{"type":"string"},"user_id":{"type":"long"},"venue_id":{"type":"long"},"zip":{"type":"string"}}}}}


4

2 に答える 2

2

Elasticsearch は、マッピングを柔軟に処理できるように努めています。同時に、基礎となる検索エンジンである Lucene の制限に対処する必要があります。その結果、既存のマッピングが更新されたマッピングと矛盾する場合、新しいマッピングは無視されます。おそらくこの問題で役割を果たしたelasticsearchのもう1つの機能は、データに基づく自動マッピング作成です。だから、もしあなたが

  1. 新しいインデックスを作成しました
  2. フィールド start_at を持つレコードに、elasticsearch が認識できない形式の日付を含む文字列でインデックスを付けました
  3. start_at フィールドにタイプ「date」を割り当てる更新されたマッピング

フィールド start_at のタイプが「string」のマッピングになりました。これを回避する唯一の方法は、インデックスを削除し、最初のレコードを追加する前にマッピングを指定することです。

于 2012-05-21T11:08:15.190 に答える