3

アプリケーションに solr があり、次のシナリオをカバーする必要があります: 3 つの値を持つフィールドがあります: コーヒー ショップ ドーナツ ショップ スポーツ ショップ

「コーヒーショップ」を検索すると、上記の値のいずれかを持つすべてのドキュメントが取得されるという問題。その理由は、すべてに「お店」があるからです。この検索動作を変更して、「コーヒー ショップ」を検索すると「コーヒー ショップ」のみを含むドキュメントが取得され、「ショップ」を検索すると上記の値がすべて含まれるドキュメントが取得されるようにしようとしています。以下は私のfieldType定義です

  <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.ReversedWildcardFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory"
                splitOnNumerics="0"
                stemEnglishPossessive="1"
                splitOnCaseChange="1"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="1"
                catenateNumbers="1"
                catenateAll="0"
                preserveOriginal="1"                
                protected="protwords.txt"/>
        <filter class="solr.StopFilterFactory" 
                ignoreCase="true" 
                words="stopwords.txt" 
                enablePositionIncrements="true" /> 
        <filter class="solr.HunspellStemFilterFactory"
                dictionary="en_US.dic"
                affix="en_US.aff"
                ignoreCase="true" />       
      </analyzer>
      <analyzer type="query">        
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <charFilter class="solr.HTMLStripCharFilterFactory"/>        
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.TrimFilterFactory"/>
        <filter class="solr.WordDelimiterFilterFactory"
                splitOnNumerics="0"
                stemEnglishPossessive="1"
                splitOnCaseChange="1"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="0"
                catenateNumbers="0"
                catenateAll="0"
                preserveOriginal="1"                
                protected="protwords.txt"/>
        <filter class="solr.StopFilterFactory" 
                ignoreCase="true" 
                words="stopwords.txt" 
                enablePositionIncrements="true" />
        <filter class="solr.HunspellStemFilterFactory"
                dictionary="en_US.dic"
                affix="en_US.aff"
                ignoreCase="true" />
      </analyzer>
    </fieldType>

ありがとうございました

4

2 に答える 2

2

sac à main同じ必要性があったようですが、 (フランス語で)検索して、必要のない、handbagのみのコンテンツを返しましsacた。sacしかし、私は検索でコンテンツを返すようにしたかったのsac à mainです。

Webで数時間調査した後、私が行ったことは次のとおりです。

schema.xml、少なくともこれらのパラメータ:

<fieldType name="text" class="solr.TextField" indexed="true" stored="true" multiValued="true" positionIncrementGap="100">
  <analyzer type="index">
    …
    <filter class="solr.SynonymFilterFactory"
      synonyms="fr_expressions.txt"
      ignoreCase="true"
      expand="true" />
    …
  </analyzer>
  <analyzer type="query">
    …
    <filter class="solr.SynonymFilterFactory"
      synonyms="fr_expressions.txt"
      ignoreCase="true"
      expand="false" />
    …
  </analyzer>
</fieldType>

で、このfr_expressions.txtような行:

sac_a_main,sac a main,sacs a main

アナライザーは、索引付けされたテキストの3つの値のindexいずれかをそれらすべてに置き換えます。

アナライザーは、クエリ内の3つの値のいずれかを。queryに置き換えますsac_a_main

を検索するsac à mainと、を含むコンテンツのみがsac_a_main検索されますが、を検索するsacと、他のコンテンツと一緒にこれらのコンテンツも検索されます。

HTH

于 2012-10-22T08:33:13.507 に答える
0

schema.xml には、デフォルトで OR になるデフォルトの演算子があります。ただし、それに依存しないように言われています (ただし、AND に変更します)。

「説明」フィールドで検索していると仮定すると、次のことができます。

説明:"コーヒー ショップ" <<< これは完全に一致します (大文字と小文字は区別されません)、正確な順序で (区切りはないと思います)
説明:(コーヒー ショップ) <<< これは、両方の単語を含む説明に一致します。順序(任意の距離で、私は思う)

于 2012-04-11T15:13:49.160 に答える