Привет, я использовал обычную активную запись рельсов LIKE search в своем приложении, я начал использовать поиск солнечных пятен solr. Я хотел бы, чтобы он действовал как можно ближе к поиску LIKE.
wine.rb
#sunspot stuff
searchable :auto_index => true, :auto_remove => true do
text :name
end
#sunspot stuff
solr/conf/schema.xml
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
application_controller.rb
search_string = "will input some values here"
query = "%" + search_string + "%"
solr_search = Wine.search do
fulltext search_string
end
@solr_search_results = solr_search.results.sort_by{|e| e[:id]}
@rails_search_results = Wine.find(:all, :conditions => ['wines.name LIKE ?' , query]).sort_by{|e| e[:id]}
search1
search_string = "большой"
@solr_search_results
186 Grand Reserve
688 Grand Plaisir Cabernet Sauvignon Shiraz Malbec Petit Verdot Cabernet Franc
760 Grand Vin Blanc
768 Grand Rouge
857 Premier Grand Cru
1067 Grand Classique
1584 Grand Vin De Glenelly
3389 Grand Constance Muscat
3708 Grand Cuvèe Brut
3857 Grand Constance Muscat
@rails_search_results
186 Grand Reserve
688 Grand Plaisir Cabernet Sauvignon Shiraz Malbec Petit Verdot Cabernet Franc
760 Grand Vin Blanc
768 Grand Rouge
857 Premier Grand Cru
969 River Grandeur Cape Blend
972 River Grandeur Каберне Совиньон
973 River Grandeur Chardonnay
974 River Grandeur Шенен Блан
975 River Grandeur Пинотаж< br /> 976 River Grandeur Sauvignon Blanc
977 River Grandeur Shiraz
978 River Grandeur Rose
1067 Grand Classique
1584 Grand Vin De Glenelly
3389 Grand Constance Muscat
3708 Grand Cuvèe Brut
3857 Grand Constance Muscat
Кажется, Solr не нашел записи со словом «Grandeur», а только точные совпадения? Как я могу это исправить?
search2
search_string = "rood"
@solr_search_results
200 Дасси Руд Синсо Каберне Совиньон Руби Каберне
3198 Дасси Руд Синсо Каберне Совиньон Руби Каберне
3394 Руд
@rails_search_results
200 Дасси Руд Синсо Каберне Совиньон Руби Каберне
483 Рудеберг Ред Каберне Совиньон Шираз Мерло
484 Рудеберг Уайт Совиньон Блан Шардоне Шенен Вионье
1113 Зевенруд
> 3044 Рудвал
3198 Дасси Руд Синсо Каберне Совиньон Руби Каберне
3394 Руд
3477 Рудеберг Красный
3478 Рудеберг Белый
3594 Рудеберг Белый
3604 Рудеберг Красный< br />
Здесь происходит то же самое, solr не нашел «Roodeberg», когда search_string = «rood», он нашел только точное совпадение
Похоже, вы хотите соответствовать подстрокам.
Добавлен фильтр nGram в schema.xml для частичного соответствия. Спасибо DanS
Но все равно не отображаются все результаты
приложение/solr/conf/schema.xml
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
</fieldType>
Это все еще не совсем то, что я хочу, взгляните на следующий пример
search3
search_string = "мерл"
Обновлять