1

私がしたいこと:

  • 私はelasticsearchで検索したいタイトルと説明の2つのフィールドを持つモデル「アイテム」を持っています。
  • 単語の一部を検索するようにします。例: bicycl は、bicycle、bicycle などと一致する必要があります。

現在の状況:

  • 検索は完全一致のみを表示します

これが私のItemモデルに今あるものです:

 include Tire::Model::Search
 include Tire::Model::Callbacks

 class << self
   def search_index
     Tire.index(Item.index_name)
   end
 end

 settings :analysis => {
                    :filter => {
                      :my_ngram  => {
                        "type"     => "nGram",
                        "max_gram" => 10,
                        "min_gram" => 3 }
                    },
                    :analyzer => {
                      :my_analyzer => {
                         "type"         => "custom",
                         "tokenizer"    => "standard",
                         "filter"       => ["my_ngram"]
                       }
                    }
                  } do
   mapping do
     indexes :title,       boost: 10, analyzer: 'my_analyzer'
     indexes :description, boost: 5,  analyzer: 'my_analyzer'
   end
end

 def self.search(query_string)
   tire.search(load: true) do
     if query_string.present?
       query do
         string query_string, default_operator: "AND"
       end
     end
   end
 end
4

1 に答える 1

3

あなたがするとき...

string query_string, default_operator: "AND"

……実は魔法陣を探している_all

これが機能するには、ngram フィルターで分析されたフィールドを具体的に検索する必要があると確信しています。

should { string "title:#{query_string}", default_operator: "OR" }
should { string "description:#{query_string}", default_operator: "OR" }

例えば。

于 2012-09-04T13:00:38.090 に答える