Hey guys,
    Simple question here.
    I have a single index of recipes, from which I''m looking at the
following fields:  Name, Ingredient Text, Tags, and Description.
    The key is, I want to show all the results that come from Name,
before I show any of the results from Ingredient Text, Tags, or
Description.
    I tried doing this:
acts_as_ferret :fields => {
   :name => {:boost => 9000, :store => :yes},
   :ingredients => {:boost => 6000, :store => :yes},
   :tags => {:boost => 3000, :store => :yes},
   :description => {:boost => 1, :store => :yes}}
    I figured if I put huge boost on my fields, the "name" results
would
always come before ingredients (no matter what the score).
    Can anyone throw me any ideas on how one might do this?  Here is an
explain of one of my first results.  Perhaps I need to change the
rounding of my score?  I dunno.
Basque chicken scored 1.0
3291.866 = product of:
  6583.732 = sum of:
    674.6201 = weight(ingredients_without_brackets:chicken in 12670),
product of:
      0.2805449 = query_weight(ingredients_without_brackets:chicken),
product of:
        3.13109 = idf(doc_freq=2145)
        0.08959977 = query_norm
      2404.677 = field_weight(ingredients_without_brackets:chicken in
12670), product of:
        1.0 = tf(term_freq(ingredients_without_brackets:chicken)=1)
        3.13109 = idf(doc_freq=2145)
        768.0 = field_norm(field=ingredients_without_brackets,
doc=12670)
    5909.112 = weight(tags_with_spaces:chicken in 12670), product of:
      0.4547729 = query_weight(tags_with_spaces:chicken), product of:
        5.075603 = idf(doc_freq=306)
        0.08959977 = query_norm
      12993.54 = field_weight(tags_with_spaces:chicken in 12670),
product of:
        1.0 = tf(term_freq(tags_with_spaces:chicken)=1)
        5.075603 = idf(doc_freq=306)
        2560.0 = field_norm(field=tags_with_spaces, doc=12670)
  0.5 = coord(2/4)
   Thanks in advance,
-Gregg
-- 
Posted via http://www.ruby-forum.com/.
Hi! On Sat, Feb 03, 2007 at 01:00:49AM +0100, Gregg Pollack wrote:> Hey guys, > > Simple question here. > > I have a single index of recipes, from which I''m looking at the > following fields: Name, Ingredient Text, Tags, and Description. > > The key is, I want to show all the results that come from Name, > before I show any of the results from Ingredient Text, Tags, or > Description. > > I tried doing this: > > acts_as_ferret :fields => { > :name => {:boost => 9000, :store => :yes}, > :ingredients => {:boost => 6000, :store => :yes}, > :tags => {:boost => 3000, :store => :yes}, > :description => {:boost => 1, :store => :yes}} > > I figured if I put huge boost on my fields, the "name" results would > always come before ingredients (no matter what the score).souunds reasonable.> Can anyone throw me any ideas on how one might do this? Here is an > explain of one of my first results. Perhaps I need to change the > rounding of my score? I dunno.Scores are always between 0 and 1. You might want to set some less aggressive values for your boost values, it''s more the relation between them that counts, than their absolute value. However that way you won''t have a guarantee that the sorting will be as you intend. If this really is that important, run an explicit search only against the name field, and then one against all fields, excluding the hits you got with the first search: # get results where name fields match (might be good to escape at least # ''('' and '')'' in query): name_results = Recipe.find_by_contents(%{name:(#{query})}) # now get results where other fields match, but exclude those we already # have: ids = name_results.map(&:id).join '' OR '' other_results = Recipe.find_by_contents(%{#{query} -id:(#{ids})"}) Jens -- webit! Gesellschaft f?r neue Medien mbH www.webit.de Dipl.-Wirtschaftsingenieur Jens Kr?mer kraemer at webit.de Schnorrstra?e 76 Tel +49 351 46766 0 D-01069 Dresden Fax +49 351 46766 66
Jens,
    Thanks for the suggestion.  However, in this case the #ids field 
could contain a thousand ids, which I''m not sure is good.
    However, you just gave me another idea that involves 4 queries, but 
it doesn''t seem to be working as it should.  Can you see why?
q = "chicken"
# lets get the total (where it''s found in all the fields)
total = index.search_each(q) do |doc, score| end
puts "Total should be = #{total}"
# find count of just name results
query = qp.parse("+name:(#{q})")
puts query.to_s
total = index.search_each(query) do |doc, score| end
puts "total with name = #{total}"
# find all results where query is in ingredients but excluding the name 
results
query = qp.parse("+ingredients:(#{q}) -name:(#{q})")
puts query.to_s
total = index.search_each(query) do |doc, score| end
puts "total with ingredients = #{total}"
query = qp.parse("+tags:(#{q}) -name:(#{q}) -ingredients:(#{q})")
puts query.to_s
total = index.search_each(query) do |doc, score| end
puts "total with tags = #{total}"
query = qp.parse("+description:(#{q}) -name:(#{q}) -ingredients:(#{q}) 
-tags:(#{q})")
puts query.to_s
total = index.search_each(query) do |doc, score| end
puts "total with desc = #{total}"
    You would think that these fields would add up, but here are the 
results:
Total should be = 2225
name:chicken
total with name = 1028
+ingredients:chicken -name:chicken
total with ingredients = 2115
+tags:chicken -name:chicken -ingredients:chicken
total with tags = 18
+description:chicken -name:chicken -ingredients:chicken -tags:chicken
total with desc = 1
  As you can see, the numbers aren''t adding up, but shouldn''t
they be?
  Thanks in advance for your help.
-- 
Posted via http://www.ruby-forum.com/.