2012-05-17 1 views
3

Так что я использую sunspot в проекте rails, и я индексирую названия песен. То, что я хочу сделать, это, когда я выполняю поиск определенного термина (например, «потеряю себя»), в верхней части списка результатов, чтобы появиться записи, содержащие точное совпадение для запроса (с пробелами и все).Sunspot SOLR KeywordTokenizer - поиск не вернет правильные результаты

Чтобы сделать это, я решил определить в schema.xml используя KeywordTokenizerFactory как эти новый fieldType (я планировал использовать его наряду с обычным текстовым полем с StandardTokenizer, использовать оба эти и повысить результаты, которые вышли с помощью KeywordTokenized поле):

<fieldType name="text_exact" class="solr.TextField" omitNorms="false"> 
    <analyzer> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.TrimFilterFactory"/> 
    </analyzer> 
</fieldType> 

и добавление динамического поля, как это (не уверен, что это должно быть многозначной для этой цели, может быть, кто-то может просветить меня на это тоже):

<dynamicField name="*_exact" stored="false" type="text_exact" multiValued="true" indexed="true"/> 

Теперь в моем song.rb файле у меня есть это в конфигурации searchable:

text :song_name do 
    self.name 
end 

text :song_name_exact, as: :song_name_exact do 
    self.name 
end 

Проблема заключается в том, что, когда я пытаюсь искать с помощью song_name_exact поля я получаю не результатов, если мой запрос содержит пробелы (так что если У меня есть песня под названием foo, и я ищу foo, она найдет ее, но если у меня есть один вызываемый foo bar и поиск foo bar, поисковый запрос не даст никаких результатов.

Итак, прежде всего, я хотел бы спросить, подходит ли мой подход к этому, и почему не поиск по полю с ключевым словом tokenizer работает правильно?

+0

Что у наш поисковый запрос используется так: вам нужен аналогичный анализатор, который будет использоваться для этого слишком. –

+0

Если вы спрашиваете, использую ли я тот же анализатор для запросов и индексирования, ответ да (если вы посмотрите на конфигурацию типа поля, увидим, что я не разделял запрос и анализаторы индексов, поэтому они оба используют одни и те же вещи). –

+0

Что делать, если вы «обертываете» термин в кавычках перед поиском, но используя обычное текстовое поле? Если вам также нужны неточные совпадения, вы можете выполнить 2 поиска ... – brutuscat

ответ

1

Причина поиска «потерять себя» только не дает результата, что маркер генерируется KeywordTokenizerFactory является «потерять самостоятельно, вы», но queryParse используется пятне разделить запрос на две лексемы «потерять» и «себя»

Решение

так что вы должны искать целую фразу, добавив двойные кавычки для поиска, чтобы быть «\» потерять себя \ «»