2011-10-20 8 views
2

私はsolrを使用して、より短い検索語句(検索語句)よりも長い索引付けされた文書(通常は完全な文章)を照合するアプリケーションを構築しています。だから、私の質問は、「今は家賃が安いうちに家を買うべきか?BRを2年前に提出しました.SSローン債務でレンタルしました」と私の索引文書は「家を買う」、「家を買う」ローンレート "solr dismax phrase search

これを行う正しい方法は、帯状疱疹、dismaxパーサ、および非常に追加された "pf"フィールドを使用することだと思いました。だから、私は非常に積極的なストップワードリストを持つ "normal"テキストフィールドkw_stopped(solr 3.4のtext_en)とフレーズシングルであることを意図したkw_phrasesフィールドを持っています。その定義は次のようになります。

<fieldType name="shingle" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" 
    catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
<filter class="solr.ShingleFilterFactory" maxShingleSize="8" outputUnigrams="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" 
    catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
<filter class="solr.ShingleFilterFactory" maxShingleSize="8" outputUnigrams="false"/> 
    </analyzer> 
</fieldType> 

と私のスキーマ・フィールドは次のようになります。

<field name="kw_stopped" type="text_en" indexed="true" omitNorms="True" /> 
<!-- keywords almost as is - to provide truer match for full phrases --> 
<field name="kw_phrases" type="shingle" indexed="true" omitNorms="True" /> 

マイサーチハンドラの設定はこれです:

<requestHandler name="edismax" class="solr.SearchHandler" default="true"> 
    <lst name="defaults"> 
    <str name="defType">edismax</str> 
    <str name="echoParams">explicit</str> 
    <float name="tie">0.1</float> 
    <str name="fl"> 
    keywords 
    </str> 
    <str name="mm">1</str> 
    <str name="qf"> 
    kw_stopped^1.0 kw_phrases^5.0 
    </str> 
    <str name="pf"> 
    kw_phrases^50.0 
    </str> 
    <int name="ps">3</int> 
    <int name="qs">3</int> 
    <str name="q.alt">*:*</str> 
</lst> 
</requestHandler> 

私はdebugQueryをオンにすると、私は気づきますクエリとドキュメントがまったく同じでない限り、 "kw_phrases"はとなることはありません。は一致しません。また、parsedqueryは、クエリからトークン化されたそれぞれが "kw_stopped"に対して単一のDisjunctionMaxQuery句として表示されることを示しますが、すべての対象物はkw_phrasesフィールドの1つの巨大な句に入れられます。

私の理解のギャップはどこですか?どうすればこの作品を作れますか?

ありがとうございました! Vijay

答えて

4

長い文章を使って短い文章を検索すると、うまくいくようです。動作はORすなわち単語のいずれかと同じになるように、mm value to very low value or 0%を使用Edismax query parser

  • を使用

    • 。少なくとも2つまたは3つの単語に一致するように変更して、1つの単語が一致する単語が返されないようにすることができます。
    • これにより、返されるドキュメントの検索文字列内の用語の一致方法を制御できます。
    • pf(フレーズフィールド)を使用して、正確に一致する上位のドキュメントと一致させます。
    • 明示的なシングルフィルタの代わりに、2つまたは3つの単語の組み合わせに対してシングルが一致するドキュメントと一致するように、pf2およびpf3(フレーズフィールドを囲む)フィールドを使用します。
    • フレーズマッチに適切なスロープ値を提供するためにps(フレーズスロップ)値を使用します。

    インデックスと検索時間の両方で一般用語が一致しないようにするには、すばらしいストップワードフィルタリストが必要です。

  • +0

    あなたの答えをありがとう。私はついにpf2とpf3を試しました。これは正しい結果をもたらすようです。しかし、 "pf"はdismaxと帯状疱疹をまったく使用しないように見えますが、なぜそれが理解できないのですか? –

    関連する問題