0

Tire を使用して、車のデータベースのインデックス作成と検索を行っています。

create :mappings => {
    :cars => {
        :properties => {
            :id => {:type => 'string', :index => 'not_analyzed', :include_in_all => true},
            :user_id => {:type => 'string', :index => 'not_analyzed'},
            :name => {:type => 'string', :analyzer => 'snowball' },
            :time => {:type => 'long', :index => 'not_analyzed'},
            :origin_country => {:type => 'string', :analyzer => 'keyword', :include_in_all => false},
            :origin_state => {:type => 'string', :analyzer => 'keyword', :include_in_all => false},
            :origin_city => {:type => 'string', :analyzer => 'keyword', :include_in_all => false},
            :dealer_name => {:type => 'string', :analyzer => 'snowball', :boost => 1.5, :include_in_all => false}
        }
    }
}

クエリは次のようになります。

   s = Tire.search Search.index_name do

      query do |query|
        query.text :_all, downcased_query, :type => :phrase
      end

    end

現在、"New York Joe Dealer" を検索すると、dealer_name が "Joe Dealer" の場合、または origin_state が "New York" の場合に一致しますが、両方は一致しません。origin_state が "New York" で "dealer_name" が "Joe Dealer" (またはそのいずれか) であると一致させる方法はありますか? アイデアは、ユーザーが fre 形式のクエリ文字列を入力して、可能な限り最適な一致を見つけられるようにすることと、ユーザーが New York Joe Dealer に入り、ニューヨークの Joe Dealer で販売されているすべての車を検索することを期待することです (または、ニューヨークまたは Joe Dealer のすべての車が下位にランク付けされます)。

4

2 に答える 2

2

正しい解決策は、クエリを使用multi_matchして複数のフィールドに対して同じクエリを実行することです。Tire でサポートされています。 https://github.com/karmi/tire/blob/master/test/integration/match_query_test.rbを参照してください。

Tire.search Search.index_name do
  query do |query|
    query.match :dealer_name, downcased_query
    query.match :origin_state, downcased_query
  end
end

phrase「New York Joe Dealer」のように、クエリにディーラーと州の両方の情報が正しい順序で含まれる場合は、このタイプを使用することもできます。

于 2013-04-23T11:55:31.307 に答える
0

解決策は、「一致」タイプのフィルターに移行し、:type => :phrase を無効にすることでした。

query do |query|
    query.match :_all, downcased_query
end

並べ替えにはまだいくつかの問題があるため、時間が依然として大きな入力になりますが、これにより多くの問題が解決されます。

于 2013-04-22T14:39:10.673 に答える