2017-02-13 61 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)或TextFieldKeywordTokenizer作爲標記器類。

原因是通配符匹配是針對令牌執行的,當字符串拆分爲多個令牌時,每個令牌都將匹配通配符。 string類將整個字符串保存爲單個標記,而KeywordTokenizer的功能相同 - 但使用KeywordTokenizer可以指定其他過濾器來處理字符串,例如在存儲標記之前對字符串進行低位分割。

0

如果您正在使用EdgeNGrams,您不需要在查詢中給*。你只需要給你的前綴。另外,EdgeNGram應該只在索引配置中,但不在查詢之一。目前,你基本上是說前3個字符匹配,不管其他

我建議你解決這兩個問題,然後重試(重新加載,但不需要重新索引,因爲索引管道沒有改變)。