2012-07-04 3 views
1

Я использую solr для запроса некоторых документов. В этом случае я не хочу заказывать результаты по релевантности, я хочу, чтобы они отсортировались по названию. Я сделал следующее solrj:Сортировка запроса в Solrj с пробелом

//sort by title 
setSortField("title", SolrQuery.ORDER.asc) 

Это прекрасно работает, когда нет или пробелов косой черты в названиях документов. Когда у меня есть 4 документа, значение заголовка упорядочены так:

"A" 
"B" 
"C" 
"B D" 

Мне кажется, что Solr начинает приказывать с поля после первого пробела в нем. Любые идеи, почему это происходит?

+2

Вы используете строку или текст? Индексировано и/или хранится? Не хотите быть грубым, но ваш пример ** буквально ** истинно; '' B D' ** буквально ** приходит после 'C'? Еще, пожалуйста, разместите несколько реальных примеров. – aitchnyu

+1

Описанное поведение, вероятно, связано с вашей цепочкой индексирования. Все зависит от того, какой токенизатор и фильтры вы используете для поля заголовка. Фактически сортировка производится с индексированными значениями, которые отличаются от того, что вы видите в результатах (сохраненный контент). – javanna

ответ

0

Пример, который я описал, был построенным, но теперь я тестировал его и с данным примером, и было такое же поведение.

Я использую следующий конфиг для поля:

<fieldType name="textgen" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" enablePositionIncrements="true" words="stopwords.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" catenateAll="0" catenateNumbers="1" catenateWords="1" generateNumberParts="1" generateWordParts="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" ignoreCase="true" expand="true" synonyms="synonyms.txt"/> 
     <filter class="solr.StopFilterFactory" enablePositionIncrements="true" words="stopwords.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" catenateAll="0" catenateNumbers="0" catenateWords="0" generateNumberParts="1" generateWordParts="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Спасибо за ваши ответы.

+1

создайте еще одну копию этого поля с типом поля, используя ключевое слово tokenizer вместо символа токена. –

+0

спасибо за ваш ответ, ключевое слово tokenizer изменило порядок, но оно все еще не было заказано буквально правильно. Я попытаюсь воссоздать ошибку с базовой конфигурацией solr. – jpee

0

пожалуйста, найти тип поля для создания

{ 
    "add-field-type" : { 
    "name":"master_keyword_sort", 
    "class":"solr.TextField", 
    "positionIncrementGap":"100", 
    "analyzer" : { 
     "tokenizer":{ 
      "class":"solr.KeywordTokenizerFactory" }, 
     "filters":[{ 
      "class":"solr.PatternReplaceFilterFactory", 
      "pattern":"([^A-Za-z0-9])", 
      "replacement":"" ,"replace":"all"}, 
      { 
      "class":"solr.LowerCaseFilterFactory" 
      }]}} 
}