как реализовать поиск по подстановочным знакам с солнечным пятном

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

если я ищу 8088***

он должен возвращать все числа, начинающиеся с 8088, но не 228088560.


person Raj gupta    schedule 02.12.2011    source источник


Ответы (2)


Найдите следующие строки кода в /solr/conf/schema.xml:

<fieldType name="text" class="solr.TextField" omitNorms="false">
    ...
</fieldType>

и замените их на это:

<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="1" maxGramSize="20" side="front" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

Не забудьте перезапустить сервер solr и переиндексировать после этих изменений.

rake sunspot:solr:stop
rake sunspot:solr:start
rake sunspot:reindex
person veiko    schedule 30.11.2012

Sunspot предоставляет вам подстановочные знаки бесплатно* с помощью NGramToeknizer (иногда возникают проблемы с NGramTokenizer для слишком маленьких подмножеств и другие особенности), а это означает, что исключение на самом деле является сложной частью. Если вы знаете количество цифр в числе (скажем, 6), грубым, но эффективным способом обработки этого будет использование без (:field).greater_than(808900) без (:field).less_than(808700) ‹ -- Я не помню, являются ли .greater_than и .less_than на самом деле => и =‹ , поэтому, если они просто > и ‹, вы можете вместо этого сделать 808899 и 808800, но вы поняли идею.

**Исправление Для этого есть решение: вы можете изменить NGramFilterFactory в вашем solr/config/schema.xml на EdgeNGramFilterFactory (при условии, что у вас был NGramFilterFactory в первую очередь для поиска части слова). Это заставляет индекс разбивать только слова, начиная с начала строк. После этого перезапустите сервер и переиндексируйте.

***Все кредиты Зак Моазени из Collective Idea за это

person C Del    schedule 20.12.2011
comment
Я хочу другой поиск, если я напишу Радж, тогда он должен возвращать только совпадения, которые имеют точный Радж, и когда я ищу Раджа без двойной кавычки, он должен возвращать Радж, Раджкумар, Раджеш, Мадханрадж, и если я напишу Радж *, тогда он должен возвращать Раджа , Раджкумар , Раджеш, я уже использовал NGramFilterFactory, но не работает должным образом - person Raj gupta; 22.12.2011
comment
@ Радж Гупта, я уже делал что-то подобное. Удалось ли вам получить его или я должен опубликовать ответ? - person Chandranshu; 29.12.2011
comment
Я тоже не знаю, как сделать именно то, что искал Радж, поэтому я определенно был бы признателен за ответ. - person C Del; 30.12.2011
comment
Кажется, больше нет ни NGramFilterFactory, ни EdgeNGramFilterFactory, если уж на то пошло. - person Noz; 11.01.2013