update item search to original name-matching behavior

We originally had a regression on name-matching, where, among
other issues, `straw hat` returned items containing both "straw"
and "hat", which isn't really helpful behavior since we're sorting
alphabetically. Now, `straw hat` behaves as expected.

Additionally, "phrases like these" behave as expected, too.
This commit is contained in:
Emi Matchu 2013-01-21 13:17:36 -06:00
parent 04f29c8611
commit cded361f73
2 changed files with 29 additions and 22 deletions

View file

@ -5,8 +5,6 @@
# ANCHORS litheral key: it will not be used as template # ANCHORS litheral key: it will not be used as template
# you can store here fragments of queries to reuse in the templates below # you can store here fragments of queries to reuse in the templates below
ANCHORS: ANCHORS:
- &name_locale_partial
"name.<<locale>>^<<boost= 1>>"
- &species_support_id_partial - &species_support_id_partial
term: term:
species_support_id: <<species_support_id>> species_support_id: <<species_support_id>>
@ -17,11 +15,17 @@ ANCHORS:
terms: terms:
restricted_zone_id: <<restricted_zone_id>> restricted_zone_id: <<restricted_zone_id>>
_name_locales: _names:
*name_locale_partial multi_match:
query: <<name>>
fields: <<fields>>
type: phrase
_negative_name_locales: _negative_names:
*name_locale_partial multi_match:
query: <<name>>
fields: <<fields>>
type: phrase
_species_support_ids: _species_support_ids:
*species_support_id_partial *species_support_id_partial
@ -45,20 +49,16 @@ item_search:
- query: - query:
bool: bool:
must: must:
- multi_match:
query: <<name= ~>>
fields: <<_name_locales>>
- term: - term:
is_nc: <<is_nc= ~>> is_nc: <<is_nc= ~>>
- term: - term:
is_pb: <<is_pb= ~>> is_pb: <<is_pb= ~>>
- <<_names= ~>>
- <<_species_support_ids= ~>> - <<_species_support_ids= ~>>
- <<_occupied_zone_ids= ~>> - <<_occupied_zone_ids= ~>>
- <<_restricted_zone_ids= ~>> - <<_restricted_zone_ids= ~>>
must_not: must_not:
- multi_match: - <<_negative_names= ~>>
query: <<negative_name= ~>>
fields: <<_negative_name_locales>>
- <<_negative_species_support_ids= ~>> - <<_negative_species_support_ids= ~>>
- <<_negative_occupied_zone_ids= ~>> - <<_negative_occupied_zone_ids= ~>>
- <<_negative_restricted_zone_ids= ~>> - <<_negative_restricted_zone_ids= ~>>

View file

@ -7,7 +7,7 @@ class Item
:species_support_id => Fields::SetField, :species_support_id => Fields::SetField,
:occupied_zone_id => Fields::SetField, :occupied_zone_id => Fields::SetField,
:restricted_zone_id => Fields::SetField, :restricted_zone_id => Fields::SetField,
:name => Fields::TextField :name => Fields::SetField
} }
def initialize(filters, user) def initialize(filters, user)
@ -42,23 +42,30 @@ class Item
I18n.locales_with_neopets_language_code I18n.locales_with_neopets_language_code
final_flex_params[:locale] = locales.first final_flex_params[:locale] = locales.first
if final_flex_params[:name] || final_flex_params[:negative_name] # Extend the names/negative_names queries with the corresponding
# localalized field names.
if final_flex_params[:_names] || final_flex_params[:_negative_names]
locale_entries = locales.map do |locale| locale_entries = locales.map do |locale|
boost = (locale == I18n.locale) ? 4 : 1 boost = (locale == I18n.locale) ? 4 : 1
{:locale => locale, :boost => boost} "name.#{locale}^#{boost}"
end end
if final_flex_params[:name] # We *could* have set _name_locales once as a partial, but Flex won't
final_flex_params[:_name_locales] = locale_entries # let us call partials from inside other partials. Whatever. Assign
# it to each name entry instead. I also feel bad doing this
# afterwards, since it's kinda the field's job to return proper flex
# params, but that's a refactor for another day.
[:_names, :_negative_names].each do |key|
if final_flex_params[key]
final_flex_params[key].each do |name_query|
name_query[:fields] = locale_entries
end
end end
if final_flex_params[:negative_name]
final_flex_params[:_negative_name_locales] = locale_entries
end end
end end
result = FlexSearch.item_search(final_flex_params) result = FlexSearch.item_search(final_flex_params)
result.scoped_loaded_collection(:scopes => {'Item' => Item.with_translations}) result.loaded_collection
end end
# Load the text query labels from I18n, so that when we see, say, # Load the text query labels from I18n, so that when we see, say,