rails sunspot solr поиск по ключевым словам

Я работаю над поиском в течение 2 дней, чтобы запросить поиск по ключевым словам, используя sunspot solr. я не могу понять

Мой ожидаемый результат

если я ищу laptops in US, он должен искать ноутбук и нас

Но приведенный ниже код ищет только ноутбуки, а не другие слова. Как я могу этого достичь.

Мой полный текст работает хорошо

Я отредактировал schema.xml

<fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
      </analyzer>

      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

МОЯ модель содержит

searchable do
        text :title,:description,stored: true
        time :updated_at
        text :product do
            product.name if product
        end
        text :product_model do
            product_model.name if product_model
        end
    end

Мой контроллер

@search = Post.search do
      fulltext params[:search] do
        query_phrase_slop 1
      end
    end

Изменить 1

У меня есть две строки с pizza в одном столбце и post в другом столбце. Если я ищу pizza, он возвращает 5 результатов, если я ищу post, он возвращает 1 результат. И, наконец, если я ищу pizza post, ничего не получается. Но ожидаемый результат - получить 6 результатов.

Я изменил fulltext params[:search] do на keywords params[:search] do

Изменить 2

def index
    @search = Post.search do
      fulltext params[:search].split(' ') do
        phrase_slop 1
      end
    end
    @posts = @search.results
end

person overflow    schedule 16.09.2013    source источник
comment
'нас', вероятно, находится в списке стоп-слов, похоже, что оно исключено, несмотря на то, что явно не включает StopFilterFactory, может быть, попробовать добавить KeepWordFilterFactory с us в нем? Кроме того, вы можете попробовать изменить NGramFilter на ShingleFilter, это может дать лучшие результаты, вот документы для справки: wiki.apache.org/solr/AnalyzersTokenizersTokenFilters   -  person zrl3dx    schedule 16.09.2013
comment
поиск не ограничивается только us computer with rate of $2500 этот оператор должен искать как на компьютере, так и на $2500   -  person overflow    schedule 16.09.2013
comment
@zrl3dx, не могли бы вы проверить мой edit 1   -  person overflow    schedule 16.09.2013
comment
Хорошо, я проверил это локально, можете ли вы протестировать следующую настройку: fulltext params[:search].split(' ') ?   -  person zrl3dx    schedule 16.09.2013
comment
@zrl3dx zrl3dx Смотрите, мой edit 2 изменился, как вы упомянули, но возникает та же проблема.   -  person overflow    schedule 17.09.2013
comment
Хорошо, удалите также stored: true из поля text вашей модели и переиндексируйте.   -  person zrl3dx    schedule 17.09.2013
comment
@zrl3dx Пытался удалить stored, не работает тот же статус   -  person overflow    schedule 17.09.2013
comment
OMG, я пропустил очевидную опцию, которая была добавлена ​​в мой конфиг - кажется, я слишком устал ;) Обещаю, это последнее изменение, если это все еще не поможет, я сдаюсь. Вы можете оставить все параметры такими, какими они были, но добавить minimum_match 1 рядом с query_phrase_slop. Это логично, даже в исходниках четко написано, что если не указано значение, то все термины должны совпадать, ага.   -  person zrl3dx    schedule 18.09.2013
comment
@ zrl3dx, ты молодец, после многих дней я нашел решение с твоей помощью.   -  person overflow    schedule 18.09.2013


Ответы (1)


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

Вы должны добавить minimum_match в свой блок search, т.е.:

@search = Post.search do
      fulltext params[:search] do
        query_phrase_slop 1
        minimum_match 1
      end
    end

Если этот параметр не указан, по умолчанию используется «совпадение всех условий» (источник).

person zrl3dx    schedule 18.09.2013
comment
Не могу поверить, что я потерял 4 часа на поиски этого... Это должно быть в документации (относительно query_phrase_slop, как предупреждение)! - person Eduardo Almeida; 09.09.2017