2017-02-13 2 views
0

文字列で始まるフィールドでドキュメントをフィルタリングするにはどうすればよいですか? フィールドには、この文字列で始まる単語がすべて含まれています。最善の結果は、フィルタに最も近い順序で並べ替えるなど、最初に結果から正確な開始を得る方法と、次に残るような回答がある場合です。ありがとう。
ように:Solr 6.4.2、startswith文字列でドキュメントをフィルタリングする

 
company_name:(max*) 
result : ['Min & Max', 'Maximum speed', 'Mirana max parrot'] 

しかし、私はそれが好きたい:

 
company_name:(max*) 
result : ['Maximum speed', 'Min & Max', 'Mirana max parrot'] 

今私はテキストフィールドのこの設定を持っている:

 <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPossessiveFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPossessiveFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.EnglishMinimalStemFilterFactory"/> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15" /> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
    </fieldType> 

答えて

0

あなたはstringを使用する必要があるとしていますフィールド(StrFieldとして実装)またはKeywordTokenizerを持つTextFieldをトークナイザクラスとして使用します。

これは、トークンに対してワイルドカード一致が実行され、文字列が複数のトークンに分割されている場合、各トークンがワイルドカードと一致するためです。 stringクラスは、文字列全体を単一のトークンとして保持しますが、KeywordTokenizerは同じことを行いますが、KeywordTokenizerを使用すると、トークンを格納する前に文字列を小文字にするなど、他のフィルタを指定することもできます。

0

EdgeNGramsを使用している場合、クエリに*を付ける必要はありません。プレフィックスを付けるだけです。また、EdgeNGramは、インデックス構成にのみ含める必要がありますが、クエリには含める必要はありません。現時点では、あなたは基本的にが残りの部分にかかわらず最初の3文字で一致していると言っています

これら2つの問題を修正してもう一度やり直すことをお勧めします(リロードしますが、インデックスのパイプラインが変更されないため再インデックスする必要はありません)。

関連する問題