2017-02-16 19 views
0

"A"、 "EF" "CDE"などの部分文字列が見つかったすべての結果を取得するには、 "ABCDEF"Solr - 指定された文字列のすべての部分文字列を検索

いくつかの文字が欠落している文字列を検索すると "BDE"のような結果が得られます。この場合、 "C"をスキップすることが許可されているため無効です。

+0

どのクエリを試しましたか? – Mysterion

+0

NGramFilterを使ってみましたか? – MatsLindh

+0

あなたの質問は非常に不明です。あなたが索引をつけて見つけようとしているテキスト(ABCDEF)は何ですか?あなたが検索している検索文字列は何ですか(A、EFなど)? –

答えて

0

テキストフィールドの分析チェーンでNGramFilter(トークン化ツールではない)を使用することができます。テキストは、サブミットされたテキストの部分文字列ごとに別々のトークンに分割されます。部分文字列の最小/最大の長さを指定して、生成されたトークンの長さを調整することができます。

あなたの入力は、あなたがKeywordTokenizerを使用し、サブストリング検索するだけで、単一の文字列である場合 - これは、generate the substrings with the NgramFilterに使用される単一のトークンとして、あなたの入力文字列を保持しますが:

<filter class="solr.NGramFilterFactory"/> 

デフォルト最小/最大の値が(例から)与える、1と2である:

In: "four score" 
Tokenizer to Filter: "four", "score" 
Out: "f", "o", "u", "r", "fo", "ou", "ur", "s", "c", "o", "r", "e", "sc", "co", "or", "re" 

あなたの代わりに「4得点」を持っていると思いますので、あなたのケースでは、文字列全体が、単一の値として保持されますトークンを分離する。

wikiの例の値の1/4に与えられた例は現在間違っています(EdgeNGramFilterからコピーされたようです)ので、無視してください。

コンテンツをクエリする方法に応じて、最小値/最大値を微調整する必要があります。長さが3未満の部分文字列を問い合わせることがない場合は、最小値として3を使用します。

+0

ありがとうございました。説明はとても役に立ちます:) – Pie222

0

私はあなたのユースケースのための具体的な分析・チェーンを使用することをお勧めします:

<fieldType name="text_ngram" class="solr.TextField"> 
    <analyzer type="index"> 
     ... 
     <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/> 
    </analyzer> 
    <analyzer type="query"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt" /> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" generateNumberParts="1" catenateWords="0" 
       catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 

N.B.クエリ時に予期しない動作をしたくない場合は、Ngramトークンフィルタリングを実行しないでください。

[1] https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions#FilterDescriptions-N-GramFilter

関連する問題