2

Rails + Tire+ElasticSearchについて非常に具体的な質問がいくつかあります。

私はそれについてRailscastを見てきました、そして私はたくさんのドキュメンテーションを読みました、しかし正直に言うとそれは私の頭の上にあります。なかなか把握できない細かい点を理解してくれる人が欲しいです。

これが私のモデルのResource.rbelasticsearch部分です。

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

  mapping do
    indexes :url
    indexes :title,       :boost => 3
    indexes :description, :boost => 2
    indexes :category,    :boost => 1.5, type: 'object',
              properties: {
                name: { type: 'multi_field',
                  fields: { name: { type: 'string', analyzer: 'keyword' } } } }
    indexes :user, type: 'object',
              properties: {
                  username: { type: 'multi_field',
                      fields: { username: { type: 'string', analyzer: 'keyword' } } } }
  end  

  def self.elasticsearch(params)
    tire.search(load: true, page: params[:page], per_page: 20) do
      query { string params[:e], default_operator: "OR" } if params[:e].present?
    end
  end

  def to_indexed_json
    to_json( include: { user: { only: [:username] }, 
                    category: { only: [:name] } 
           } )
  end
  1. 'not_analyzed'はどういう意味ですか?私が読んでいるチュートリアルの多くでは、これを使用しています。分析されていないのに、なぜ含まれているのmapping doですか?
  2. インデックスを使用する目的は何ですか。たとえば、のようなものindexes :id, type: 'integer'です。整数にインデックスを付ける必要があるのはなぜですか?それはパフォーマンスなどに役立ちますか?
  3. URLのアナライザーを変更して、より適切に機能させるにはどうすればよいですか?たとえば、として保存されている場合http://www.dropbox.com、検索dropbox.comしても結果は見つかりませんが、検索されwww.dropbox.comます。さまざまなアナライザーをすべて貼り付けてみましたが、URLに対して実際に機能するアナライザーはありません。
  4. 「本」、「映画」、「テープ」など、複数形で保存されている場合category.name、アナライザーに単数形と複数形に基づいてこの単語を表示するように指示するにはどうすればよいですか。「映画」の検索は機能しませんが、「映画」は機能します
  5. を削除するload: trueと、サイト全体が壊れます。彼はこれをレールキャストで調べましたが、ほんの一瞬でした。つまり、すべての属性(および関連付け)をマッピングに移動し、それを:not_analyzedに変更する必要がありますか?(私はちょうど気づきました...多分私はちょうど自分の質問#1に答えました!)
  6. 一般に、ORに最適なデータの種類と、ANDに最適なデータはどれですか。より多くの結果を得る限り、私は考えているか、より寛大に思えます
4

2 に答える 2

4

Luceneがすべてです。インデックス付きフィールドは、検索するフィールドです。フィールドにインデックスを付けると、それを分析するかどうかを決定できます。つまり、トークン化したり、トークンフィルタを適用したりせずに、そのままインデックスを作成できます。それ以外の場合は、アナライザーを適用できます。Luceneですぐに利用できるアナライザーがいくつかあり、elasticsearchでも公開されています。アナライザーは、トークナイザーとトークンフィルターのリストで構成されます。トークナイザーは、フィールドコンテンツをさまざまな用語で分割する方法を決定します。トークンフィルターを使用すると、これらの用語をフィルター処理したり、変更したりできます。

たとえば、トークン化の最も一般的な方法は、WhitespaceTokenizerを使用することです。次に、たとえば、用語の語幹にインデックスを付けるために語幹を適用できます。たとえば、runningになりrun、複数形は単数になります。

場合によっては(実際にはかなり頻繁に)、使用するトークナイザーとトークンフィルターを組み合わせて独自のアナライザーを作成する必要があります。カスタムアナライザーを定義する設定内のelasticsearchでそれを行うことができます。

検索するつもりがないので、luceneでインデックス付けしたくないフィールドがありますが、それらを保存したい場合があります。保存されたフィールドは、検索結果内で返したいフィールドです。実際、luceneはインデックス付きフィールドを検索できますが、保存されているフィールドのみを返すことができます。幸い、elasticsearchを使用すると、_sourceドキュメント全体を保存できるため、デフォルトでインデックスを作成したドキュメント全体を取得できます。ソースをelasticsearchに保存したくない場合は、いつでもこの機能を無効にできます。それ以外の場合、クエリ中にソース全体を戻したくない場合は、フィールドのリストを指定するだけです。あなたが戻したいこと。それらが保存されている場合(マッピングで構成できます。各フィールドのデフォルトはインデックス付けされますが、保存されません)、すぐに返されます。それ以外の場合は、ソース自体から抽出されます(無効になっていない場合)。大きなドキュメントがある場合は、必要なフィールドを構成することをお勧めします。そうしないと、毎回ソース全体が返されます。

于 2012-09-26T08:38:25.797 に答える
1
  1. 分析されていないということは、フィールドがアナライザーパイプライン(トークン、フィルターなど)を使用していないことを意味します。フィールドは引き続き検索可能です。

  2. indexescolumnこれは、フィールドについてタイヤに伝える方法です。これは、( activerecordの移行のように)新しいフィールドを追加するためのdslキーワードにすぎません。Elasticsearchのすべてがインデックスに登録されます

  3. 独自のアナライザーを作成する必要がある場合があります。これは、既存のトークナイザー、フィルターなどをつなぎ合わせることにより、インデックス設定として実行できます。

  4. フィルターの1つとしてelasticsearchに付属のステマーの1つを使用するアナライザーをセットアップします

  5. そのための別の質問を作成したようです

  6. 私はそれが答えられるとは思わない。それはあなたがそれを探しているものにデータが何であるかに依存します

于 2012-09-26T08:18:58.730 に答える