2016-07-12 10 views
0

私はSolrと一緒に作業しており、EdgeNGramFilterFactoryの仕組みを理解したいと思います。Solr nGramフィルタminGramSize - 2文字のみの単語のトークン

たとえば、「1 tb」という用語を検索しています。私が検索しているフィールドの属性を持つ製品はほとんどありません。

これは、このフィールドタイプのインデックス時間に適用されるフィルタです。

<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="10" /> 

ここで「1 tb」という用語を検索すると、結果が得られません。

「5メガピクセル」の商品がほとんどありません。「5メガ」を検索すると結果が出ます。後で私はそれが "5私"のために働かないことがわかった。結果は出ない。

nGramフィルタを削除しても正常に動作します。さらに、minGramSize = "1"に設定すると、クエリ "1 tb"が正常に動作します。

私はtbという用語に対して、トークンtbが有効であると仮定していました。しかし、2のminGramSizeを適用すると作成されないようです!

誰かが理由を説明できますか?

ここにはスキーマで定義されたフィールドがあります。

<fieldType name="AttributesField" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="10" /> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
    </fieldType> 
+0

に分解されますと

Example: "riding", "rides", "horses" ==> "ride", "ride", "hors". <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 

あなたはSolrの管理ページで同じように分析したのですか?フィールドに使用された正確なfieldTypeは何ですか? –

+0

テキストフィールドタイプを作成して、別々のフィルタとトークナイザを適用しました。 – Krunal

+0

同じことを説明できますか?それは何を持っていますか? –

答えて

0

あなたはFIELDTYPE

<fieldType name="AttributesField" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="10" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 
以下

PorterStemFilterFactoryで試すことができます:それは言葉から、共通の語尾を削除する正規化処理を行います。文字列値以下の構成Nigerianは、次の用語

Nigerian => "ni", "nig", "nige", "niger", "nigeri", "nigeria", "nigeria", "nigerian" 
+0

私はこれを試しました、同じ結果を得ました。どのようにしてどのトークンが作られているかチェックできますか? – Krunal

+0

solr解析ページでも同じことを確認してください。インデックス時に作成されたトークンと、クエリ時に送信されたトークンが表示されます。 –

+0

http:// hostname:8983/solr/.......... ... https://cwiki.apache.org/confluence/display/solr/Query+Screen –

関連する問題