2

私はスラング辞書タイプのウェブサイトを運営しており、以前はサイト検索に mysql LIKE を使用していました。問題なく動作しました。とにかく、今私はサイトを更新していて、SOLR で django-haystack を使用することを考えていました (最良の検索オプションの 1 つと思われますか?)

実行しましたが、検索結果が良くありません。たとえば、「LOL」という単語を検索すると、「LOL LOL LOL LOL LOL LOL」という単語が最初に表示される代わりに、「LOL LOL LOL LOL LOL LOL」であふれている例もあるため、最初の結果として「Flood」が返されます。

では、Flood の例から 1 つの LOL のみをトークン化することは可能ですか (私は SOLR を初めて使用するので、これは私の考えが間違っている可能性があります)。または、単語のタイトルの価値を高めることはできますか (つまり、検索語がタイトルに一致する単語が最初に来て、検索語が例に一致する単語が 2 番目になります)。django-haystack フィールド ブーストを試しましたが、あまり効果がないようです。

前もって感謝します!

編集: SOLR スキームは次のとおりです (少し大きく、ほとんどが Django-Haystack によって自動生成されます)。

<?xml version="1.0" ?>
<schema name="default" version="1.1">
  <types>
    <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>

    <!-- Numeric field types that manipulate the value into
         a string value that isn't human-readable in its internal form,
         but with a lexicographic ordering the same as the numeric ordering,
         so that range queries work correctly. -->
    <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>

    <fieldType name="date" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>

    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <!-- find finnish ones <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> -->
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="Finnish" />
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="Finnish" />
        <!-- <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> -->
        <!-- find finnish ones <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> -->
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
    </fieldType>

    <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      </analyzer>
    </fieldType>

    <fieldType name="ngram" class="solr.TextField" >
      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

    <fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
      </analyzer>
    </fieldType>
  </types>

  <fields>   
    <!-- general -->
    <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
    <field name="django_ct" type="string" indexed="true" stored="true" multiValued="false" />
    <field name="django_id" type="string" indexed="true" stored="true" multiValued="false" />

    <dynamicField name="*_i"  type="sint"    indexed="true"  stored="true"/>
    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>
    <dynamicField name="*_l"  type="slong"   indexed="true"  stored="true"/>
    <dynamicField name="*_t"  type="text"    indexed="true"  stored="true"/>
    <dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>
    <dynamicField name="*_f"  type="sfloat"  indexed="true"  stored="true"/>
    <dynamicField name="*_d"  type="sdouble" indexed="true"  stored="true"/>
    <dynamicField name="*_dt" type="date"    indexed="true"  stored="true"/>


    <field name="rendered" type="string" indexed="false" stored="true" multiValued="false" />

    <field name="word" type="text" indexed="true" stored="true" multiValued="false" />

    <field name="author" type="text" indexed="true" stored="true" multiValued="false" />

    <field name="text" type="text" indexed="true" stored="true" multiValued="false" />

    <field name="explanation" type="text" indexed="true" stored="true" multiValued="false" />

    <field name="example" type="text" indexed="true" stored="true" multiValued="false" />

  </fields>

  <!-- field to use to determine and enforce document uniqueness. -->
  <uniqueKey>id</uniqueKey>

  <!-- field for the QueryParser to use when an explicit fieldname is absent -->
  <defaultSearchField>text</defaultSearchField>

  <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
  <solrQueryParser defaultOperator="AND" />
</schema>
4

1 に答える 1

3

あなたの最後のコメントは私にとってそれを片付けました。あなたが見る必要があるのは、一般的に関連性であり、あなたの場合はフィールドブースティングが特別です。

フィールドでクエリ時間ブーストを使用するには、Solr の DisMax ハンドラーまたはその拡張機能である eDisMax ハンドラーを使用する必要があります。そのハンドラーのqfパラメータを介して、検索するフィールドと、各フィールドのブースト方法を指定できます。

例えば

qf="word^10.0 title^5.0 exmaple^0.5"
  • ドキュメントが単語のヒットで一致した場合、そのスコアを 10 ずつ増やします
  • ドキュメントがタイトルのヒットと一致する場合、そのスコアを 5 ずつ増やします
  • ドキュメントが例のヒットで一致した場合、そのスコアを 0.5 ずつ増やします。これは減分に相当します。

その qf パラメータは、Solr に送信するすべての検索クエリに追加するか、solrconfig.xml で構成できます。

<requestHandler name="standard" 
    class="solr.StandardRequestHandler" default="true">
    <!-- default values for query parameters -->
    <lst name="defaults">
        <str name="defType">edismax</str>
        <str name="q.alt">*:*</str>
        <str name="qf">word^10.0 title^5.0 exmaple^0.5</str>
        <str name="fl">*,score</str>
        <str name="mm">100%</str>
    </lst>
</requestHandler>

<queryParser name="edismax" 
    class="org.apache.solr.search.ExtendedDismaxQParserPlugin" />

さらに読む

于 2013-10-07T09:51:29.590 に答える