2013-06-20 5 views
3

Я использую драгоценный камень sunspot_rails, и все работает идеально, но: я не получаю никаких результатов поиска для слов с дефисом.Rails sunspot-solr - слова с дефисом

Пример: Строка «Tron» возвращает много результатов (слово упоминается во всех статьях е-Tron)

Строка «е-Tron» возвращает 0 результатов, даже если это правильное слово упомянутых во всех моих статьях.

Мой текущий schema.xml конфигурации:

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer type="index"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Что я хочу: Поведение для строки поиска Tron в порядке, конечно, но я также хочу, чтобы иметь правильные спички для поиска строки электронной Tron ,

ответ

8

Проблема в том, что solr.StandardTokenizerFactory разделяет слова на дефисы, поэтому «e-tron» генерирует токены «e», «tron». Предположительно «e» теряется как фильтры solr.TextField с минимальным размером токена 2.

Это один из примеров, который покажет вашу конкретную проблему.

<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 
  1. solr.WhitespaceTokenizerFactory будет генерировать маркеры на пробельных. ["e-tron"]
  2. solr.WordDelimiterFilterFactory будет разделен на дефисы, но также сохранит исходное слово. ["e", "tron", "e-tron"]
+0

Ну, это улучшение, но теперь я получил 156 хитов для электронной Tron и 32 хитов для Tron - Это не может быть верно :( –

+0

«е-Tron» будет искать как «е-Tron »и« tron ​​», поэтому потенциальные результаты могут быть найдены таким образом. Это дает вам подсказки? Я не могу сказать больше, не зная, какие результаты вы получаете. – polmiro

+0

Хорошо, это хорошая подсказка. Возможно, у нас есть недоразумение здесь: В строке поиска «e-tron» нужно искать статьи со словом «e-tron» (нет необходимости искать «tron» - это будет бонус). Единственное, что мне нужно: каждый поиск «e-tron» -tron «находит все с помощью« e-tron », и каждый поиск« tron ​​»находит все для« tron ​​»и« e-tron »- надеюсь, вы знаете, что я имею в виду. Спасибо за всю помощь до сих пор. –