2011-11-15 13 views
7

私はschema.xmlをして次のフィルタを使用します。solrでより長いngramを増やすには?

<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front"/> 

は、どのように私は長いngramsを高めることができますか?例えば、「ブックページ」を検索すると、「ブックページ」を含むドキュメントは、「ブック」のみのドキュメントよりも格段に高く評価されるはずです。

答えて

5

用語長に基づいて(つまり、関数クエリ演算子を使用して)動的に増強する方法はわかりません。私はそれがないと思う。

しかし、私はしばしば、あなたが探している論理を近似したいと思います。

最も一般的には、テキスト値を2つの異なるフィールドにインデックスします。 1つは、最小限処理されたテキストフィールドで、nグラムはありません。もう1つは同様ですが、nグラムでも処理されます。

ここでは、この方法で使用したスキーマの抜粋をいくつか紹介します。このスキーマに対する検索では、textフィールドを大きくtext_ngram以上に増やしています。したがって、textフィールドとの一致は関連性に大きく影響し、text_ngramとの一致はおそらく関連性の高い結果を引き出すことができます。

<?xml version="1.0" encoding="UTF-8"?> 
<schema name="Sunspot Customized NZ" version="1.0"> 
    <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> 

    <!-- id, other scalar values --> 

    <!-- catch-all for the text and text_ngram types --> 
    <field name="text"  stored="false" type="text"  multiValued="true" indexed="true" /> 
    <field name="text_ngram" stored="false" type="text_ngram" multiValued="true" indexed="true" /> 

    <!-- various dynamicField definitions --> 

    <!-- sample dynamicField definitions for text and text_ngram --> 
    <dynamicField name="*_text" type="text" indexed="true" stored="false" multiValued="false" /> 
    <dynamicField name="*_text_ngram" type="text_ngram" indexed="true" stored="false" multiValued="false" /> 

    </fields> 

    <!-- copy text fields into my text and text_ngram catch-all fields --> 
    <copyField source="*_text" dest="text" /> 
    <copyField source="*_text" dest="text_ngram" /> 

</schema> 

これはあなたが探しているものではありませんが、同様のアプローチを使用できます。例えば

、中間NGRAM処理フィールドタイプの小さなコレクションの作成 - 応じてブーストを増加させ、それらを与える - 言う、長さ1-3、4-6、7-9。

+0

うわー、このアプローチには大変感謝していますが、複数回インデックスを作成することについては考えていませんでした。このソリューションはどのように思いつきましたか? – ndee

+1

私はこのテクニックを初めて使用したときに私は本当に覚えていない - それはSolrのかなり一般的なアプローチだと思う。 'copyField'ディレクティブは、この効果のかなり強いヒントです。私はしばしば、正確な用語マッチが最も強い意味論的価値を有するものと考える。シノニム、nグラム、ステミングなどはすべて、正確な用語でミスした場合の検索結果を「拡張」するための様々なアプローチである。 –

関連する問題