2017-02-13 4 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) или TextField с номером KeywordTokenizer в качестве класса токенизатора.

Причина этого в том, что сопоставление подстановочных знаков выполняется против токенов, а когда строка разделена на несколько токенов, каждый токен будет соответствовать шаблону. Класс string сохраняет всю строку в виде единственного токена, в то время как KeywordTokenizer делает то же самое - но с помощью KeywordTokenizer вы также можете указать другие фильтры для обработки строки, например, нижний регистр строки перед сохранением токена.

0

Если вы используете EdgeNGrams, вам не нужно указывать * в запросе. Вам просто нужно указать свой префикс. Кроме того, EdgeNGram должен находиться только в индексе, но не в запросе . На данный момент вы в основном говорите, что соответствует первым 3 символам, независимо от остальных.

Я предлагаю вам исправить эти две вещи и повторить попытку (перезагрузить, но не нужно переиндексации, поскольку конвейер индексации не изменился).