1

これが比較的簡単であると言及している多くのアカウントを見てきましたが、私はそれが適切に機能していることを確認できませんでした. 私がこれを持っているとしましょう:

class Car < ActiveRecord::Base
  settings analysis: {
    filter: {
      ngram_filter: { type: "nGram", min_gram: 3, max_gram: 12 }
    },
    analyzer: {
      partial_analyzer: {
        type: "snowball",
        tokenizer: "standard",
        filter: ["standard", "lowercase", "ngram_filter"]
      }
    }
  } do
    mapping do
      indexes :name,                    index_analyzer: "partial_analyzer"
    end
  end
end

「フォード」という名前の車があり、インデックスを更新するとします。ここで、「フォード」を検索すると、次のようになります。

Car.tire.search { query { string "Ford" } }

私の車は私の結果です。さて、「For」を探すと:

Car.tire.search { query { string "For" } }

私の車はもう見つかりません。nGram フィルターが自動的に処理してくれると思っていましたが、どうやらそうではないようです。一時的な解決策として、このような検索にワイルドカード (*) を使用していますが、検索の min_gram および max_gram 定義の重要な要素であるため、これは間違いなく最善の方法ではありません。彼らがこれをどのように解決したか誰か教えてもらえますか?

Ruby 1.9.3 で Rails 3.2.12 を使用しています。エラスティックサーチのバージョンは 0.20.5 です。

4

1 に答える 1

5

スノーボール アナライザーの代わりにカスタム アナライザーを使用したい場合: Elasticsearch カスタム アナライザー

基本的に、他のアナライザーには、定義済みのフィルターとトークナイザーのセットが付属しています。

おそらく、Edge-Ngram フィルターも使用する必要があります。Edge-Ngram フィルター

Edge-NGram と NGram の違いは基本的に Edge-Ngram であり、基本的に用語の「端」にのみ固執します。したがって、それは前または後ろから始まります。Ford -> [For] の代わりに -> [For, ord]

オートコンプリートのトピックに関するより高度なリンク:

あいまいさを伴うオートコンプリート (純粋な Elasticsearch、タイヤはありませんが、非常に優れた読み取り)

リンクが提供されている別の有用な質問

編集

基本的に、私はあなたが持っているものと非常によく似た設定をしています。ただし、タイトル用の別のアナライザーと両方のマルチフィールドがあります。また、多言語サポートのため、名前だけではなく、名前の配列がここにあります。

また、search_analyzer を指定し、シンボルの代わりに文字列キーを使用します。これは私が実際に持っているものです:

settings "analysis" => {
    "filter" => {
        "name_ngrams"  => {
            "side"     => "front",
            "max_gram" => 20,
            "min_gram" => 2,
            "type"     => "edgeNGram"
        }
    },
    "analyzer" => {
        "full_name"     => {
            "filter"    => %w(standard lowercase asciifolding),
            "type"      => "custom",
            "tokenizer" => "letter"
        },
        "partial_name"        => {
            "filter"    => %w(standard lowercase asciifolding name_ngrams),
            "type"      => "custom",
            "tokenizer" => "standard"
        }
    }
} do
  mapping do
    indexes :names do
      mapping do
        indexes :name, :type => 'multi_field',
                :fields => {
                    "partial"           => {
                        "search_analyzer" => "full_name",
                        "index_analyzer"  => "partial_name",
                        "type"            => "string"
                    },
                    "title"      => {
                        "type"     => "string",
                        "analyzer" => "full_name"
                    }
                }
      end
    end
  end
end
于 2013-03-12T09:44:44.777 に答える