15

間違っている場合は教えてください。solr は schema.xml で既に言及されているフィールドのみを想定していると思います。したがって、「タイトル」というフィールドがある場合は、スキーマでこれを言及する必要があります。

Sunspot のドキュメントには、schema.xml の変更についての言及はありません。Sunspot がどのように schema.xml を変更し、カスタム フィールドをインデックスに入力できるようにするのか疑問に思っています。

また、Sunspot が RSolr を使用して処理を行っていることも知っています。したがって、RSolr を使用してスキーマを変更し、DB から Solr にデータをリロードする方法があれば教えてください。

4

2 に答える 2

32

karmajunkie が暗示しているように、Sunspot は独自の標準スキーマを使用しています。ここでは、その仕組みについてもう少し詳しく説明します。

Solr スキーマ 101

この議論の目的のために、Solr スキーマは主に 2 つのもので構成されています: 型定義とフィールド定義です。

定義は、その名前、型のtypeJava クラス、および一部の型 (特にテキスト) の場合は、その型の処理方法を構成する XML の従属ブロックを指定することによって、型を設定します。

定義を使用するfieldと、フィールドの名前と、そのフィールドに含まれる値のタイプの名前を定義できます。これにより、Solr はドキュメント内のフィールドの名前とそのタイプ、およびその他のいくつかのオプションを関連付けることができ、そのフィールドの値をインデックスで処理する方法を知ることができます。

Solr はdynamicField定義もサポートしており、静的フィールド名の代わりに、グロブを含むパターンを指定できます。入力フィールドは、そのタイプを判別するために、これらのパターンと一致する名前を持つことができます。

黒点の従来のスキーマ

Sunspot のスキーマにはfield、ID やモデル名など、内部で使用されるフィールドの定義がいくつかあります。さらに、Sunspot はdynamicField定義を自由に使用して、型に基づく命名規則を確立します。

このフィールド命名規則の使用により、Sunspot は、モデルから XML ドキュメントへのマッピングを作成し、Solr によるインデックス作成の準備が整った構成 DSL を定義できます。

たとえば、モデル内のこの単純な構成ブロックは…</p>

searchable do
  text :body
end

…のフィールド名を作成するために Sunspot によって使用されますbody_text。このフィールド名は、スキーマ内の次の定義の*_textパターンと照合されます。dynamicField

<dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="true"/>

_textこれにより、接尾辞を持つすべてのフィールドが Sunspot の型の定義にマップされますtext。Sunspot の schema.xml を見てみると、他のタイプやオプションについても同様の規則が多数あることがわかります。:stored => trueたとえば、このオプションは通常s、その型のサフィックスに を追加します (例: _texts)。

実際に Sunspot のスキーマを変更する

クライアントや私自身のプロジェクトでの私の経験では、Sunspot のスキーマを変更するのに適したケースが 2 つあります。まず、textアプリケーションが必要とするさまざまな機能に基づいて、フィールドのアナライザーを変更します。そして 2 つ目は、Solr アナライザーのよりきめ細かいアプリケーション用に (通常はテキスト型に基づいて) まったく新しい型を作成することです。

たとえば、「ファジー」検索による検索一致の拡張は、言語語幹 (NGram) も使用する特別なテキストベースのフィールドに対する一致で実行できます。text元のフィールドのトークンは、スペルチェックに入力したり、完全一致を強化したりするために使用できます。text_ngramまた、カスタムまたはのトークンはtext_en、より厳密な一致が失敗した場合に検索結果を広げるのに役立ちます。

Sunspot の DSL は、フィールドをこれらのカスタム フィールドにマッピングするための 1 つの最後の機能を提供します。typeとそれに対応するdynamicField定義を設定したら、Sunspot の:asオプションを使用して、慣習に基づく名前生成をオーバーライドできます。

たとえばngram、上記のカスタム タイプを追加すると、次の Ruby コードを使用して NGrams でボディを再度処理することになる場合があります。

searchable do
  text :body
  text :body_ngram, :as => 'body_ngram'
end
于 2011-08-25T21:03:04.387 に答える
4

Sunspot には、sunspot 統合用に少し調整されたストック スキーマが付属しています。これは、開発者にとって驚きを最小限に抑えるという原則に準拠しています。たとえば、ストック solrconfig.xml は自動コミットをオフにするように設定されています。これをオンにします。スキーマは、実際にはフィールドよりもに関係しています。新しいフィールド型を作成する方法の例については、以下のリンクを参照してください。フィールドが既存のタイプのいずれかに適合する場合、フィールドのインデックス作成は簡単です。例えば:

class Blog
  searchable do
     text :title
  end
end

検索プロセスでは、次のようにします。

class BlogSearch
   def self.search(options={})
     Sunspot.search(Blog) do
       with(:title, options[:title]) if options[:title].present?
     end
   end
end

Sunspot の wiki には、追加のドキュメントが多数あります。ngram 検索を可能にするカスタム タイプを追加する例を次に示します。

https://github.com/outoftime/sunspot/wiki/Wildcard-searching-with-ngrams

于 2011-08-25T20:38:04.997 に答える