4

sunspot_railsインスタンスにクエリを送信するために使用していSolrます。すべて問題なく動作しますが、次の基準で結果を並べ替えたいと考えています。最初に、一致する用語が単語の一部ではなく単語として表示されるドキュメントを取得します。

したがって、2 つのドキュメントがある場合:

1)SolrでのSolr検索は素晴らしい

2) Solr はフリーテキストでの検索をサポートするのに非常に優れています

そして、私が探している用語は : ですsearch

両方のドキュメントを結果に含めたいのですが、(2) のドキュメントを最初に表示させたいです。

試してみorder_by :score, :descましたが、うまくいかないようです。「スコア」がどのように計算されるかを伝える方法を見つけない限り。

よろしくお願いします

4

2 に答える 2

3

Solr で 2 つのフィールドを維持する必要があります。
1 つは元の値、もうtext_org and text (which is analyzed)
1 つは分析された値です。たとえば、それに応じてブーストを調整し、元のフィールド値を分析された値よりもブーストすることができます。たとえば、元の値text_org^2 text^1
と一致する場合は、分析されたテキストまたは単語全体の正確な一致は、通常の一致よりも多くなります。

于 2012-12-15T11:10:25.813 に答える
1

Jayendra の回答を少し拡張すると、2 つの別々のフィールドにインデックスを作成する必要があります。

これは、Sunspot の schema.xml の抜粋の例です。これは、以前の質問に対する私の回答からのものです: How to boost long ngrams in solr?

<schema>
  <types>

    <!--
      A text type with minimal text processing, for the greatest semantic
      value in a term match. Boost this field heavily.
    -->
    <fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory" />
        <filter class="solr.StandardFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
      </analyzer>
    </fieldType>

    <!--
      Looser matches with NGram processing for substrings of terms and synonyms
    -->
    <fieldType name="text_ngram" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory" />
        <filter class="solr.StandardFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="6" side="front" />
      </analyzer>
    </fieldType>

    <!-- other stuff -->

  </types>
  <fields>

    <!-- other fields; refer to *_text -->

    <dynamicField name="*_ngram" type="text_ngram" ... />

  </fields>
</schema>

searchableブロックでは、:asオプションを使用してフィールド名を指定できます。

searchable do 

  text :title
  text :title, :as => :title_ngram

  # ...

end
于 2012-12-19T21:37:32.667 に答える