Я разрабатываю приложение rails с поисковой системой sunspot Solr, и мне нужно индексировать телефонные номера в Solr 4.1.
Например, если у меня есть номер телефона «+12 (456) 789-0101», моя страница должна быть основана на запросах:
- +12 (456) 789-0101 (телефон в правильном формате)
- +12 (456) 789......... (левая часть телефона в правильном формате)
- .......(456) 789-0101 (правая часть телефона в правильном формате)
.......(456) 789......... (средняя часть телефона в правильном формате)
124567890101 (полный телефон только с номерами)
- 1245678........... (левая часть телефона с цепочками номеров)
- ............890101 (правая часть телефона с цепочками номеров)
- ......567890...... (средняя часть телефона с цепочками номеров)
Я знаю, что могу использовать:
EdgeNGramFilterFactory
для разделения телефона на NGrams (спереди и сзади)WordDelimiterFilterFactory
для объединения номеров и разделения телефона на запчасти.
Итак, что я сделал:
Создайте новый тип поля Solr в
shema.xml
:<fieldType name="phone_number" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="front"/> <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="back"/> </analyzer> </fieldType>
<dynamicField name="*_phone" stored="false" type="phone_number" multiValued="true" indexed="true"/>
Определите доступные для поиска поля телефона как тип '*_phone':
string :work_phone, :as => :work_phone, :stored => true do work_phone.gsub(/\D/, '') if work_phone end
string :mobile_phone, :as => :mobile_phone, :stored => true do mobile_phone.gsub(/\D/, '') if mobile_phone end
Запустите переиндексацию:
bundle exec rake sunspot:rebuild
Но это не работает, когда переиндексация завершена, я могу найти результаты только по запросам: "полный телефон" и "левая часть телефона". Поиск по "средняя часть телефона" и "правая часть телефона" не дает мне никаких результатов.
Я сделал что-то не так? Как правильно сделать обжиг деталей телефона? Пожалуйста помоги. Спасибо!