Nasos Psarrakos / psarrakos@gmail.com / nasospsa
Searching for 'chick'en..
Food table, 1000 chickens → no pretty results
Search Term: "chick"
SELECT long_desc FROM foods
WHERE long_desc LIKE '%CHICK%'
LIMIT 7;
long_desc
----------------------------------------------------------------------------------------
Chicken, gizzard, all classes, cooked, simmered
Chicken, broiler, rotisserie, BBQ, breast meat only
Chicken, broilers or fryers, meat and skin and giblets and neck, raw
Chicken, broilers or fryers, meat and skin and giblets and neck, cooked, fried, batter
Chicken, broilers or fryers, meat and skin and giblets and neck, cooked, fried, flour
Chicken, broilers or fryers, meat and skin and giblets and neck, roasted
Chicken, broilers or fryers, meat and skin and giblets and neck, stewed
postgresql :: Full Text Search
SELECT long_desc, ts_rank_cd(to_tsvector(long_desc), query) AS rank
FROM foods, to_tsquery('chick') query
WHERE to_tsvector(long_desc) @@ query
ORDER BY rank DESC
LIMIT 7;
long_desc | rank
--------------------------------+------
CHICK-FIL-A, Chick-n-Strips | 0.2
SMART SOUP, Moroccan Chick Pea | 0.1
CHICK-FIL-A, hash browns | 0.1
SELECT long_desc, ts_rank_cd(to_tsvector(long_desc), query) AS rank
FROM foods, to_tsquery('chicken') query
WHERE to_tsvector(long_desc) @@ query
ORDER BY rank DESC
LIMIT 7;
long_desc | rank
----------------------------------------------------------------------------------------+------
SUPPER BAKES MEAL KITS, Garlic Chicken with pasta (chicken not included) | 0.2
SUPPER BAKES MEAL KITS, Lemon Chicken with herb rice (chicken not included) | 0.2
CAMPBELL'S Red and White, GOLDFISH Pasta with Chicken in Chicken Broth, condensed | 0.2
SUPPER BAKES MEAL KITS, Cheesy Chicken with pasta (chicken not included) | 0.2
SUPPER BAKES MEAL KITS, Herb Chicken with rice (chicken not included) | 0.2
SUPPER BAKES MEAL KITS, Traditional Roast Chicken with stuffing (chicken not included) | 0.2
SUPPER BAKES MEAL KITS, Southwestern-Style Chicken w/rice (chicken not included) | 0.2
Sphinx via thinking-sphinx
ThinkingSphinx::Index.define :food, :with => :real_time do
indexes long_desc, {
sortable: true,
enable_star: true,
min_infix_len: 3
}
end
Food.search('chick*', limit: 10).map(&:long_desc)
["CAMPBELL'S Red and White, GOLDFISH Pasta with Chicken in Chicken Broth, condensed",
"CHICK-FIL-A, Chick-n-Strips",
"SUPPER BAKES MEAL KITS, Cheesy Chicken with pasta (chicken not included)",
"SUPPER BAKES MEAL KITS, Garlic Chicken with pasta (chicken not included)",
"SUPPER BAKES MEAL KITS, Herb Chicken with rice (chicken not included)",
"SUPPER BAKES MEAL KITS, Lemon Chicken with herb rice (chicken not included)",
"SUPPER BAKES MEAL KITS, Southwestern-Style Chicken w/rice (chicken not included)",
"SUPPER BAKES MEAL KITS, Traditional Roast Chicken with stuffing (chicken not included)",
"Babyfood, meat, chicken, strained",
"Babyfood, meat, chicken, junior"]
Food.search('chick*', {
match_mode: :extended,
ranker: :SPH04,
limit: 10
}).map(&:long_desc)
["CHICK-FIL-A, Chick-n-Strips",
"Chicken, broiler, rotisserie, BBQ, breast meat only",
"Chicken, broilers or fryers, meat and skin and giblets and neck, raw",
"Chicken, broilers or fryers, meat and skin and giblets and neck, cooked, fried, batter",
"Chicken, broilers or fryers, meat and skin and giblets and neck, cooked, fried, flour",
"Chicken, broilers or fryers, meat and skin and giblets and neck, roasted",
"Chicken, broilers or fryers, meat and skin and giblets and neck, stewed",
"Chicken, broilers or fryers, meat and skin, raw",
"Chicken, broilers or fryers, meat and skin, cooked, fried, batter",
"Chicken, broilers or fryers, meat and skin, cooked, fried, flour"]
SPH_RANK_SPH04, added in version 1.10-beta, is generally based on the default SPH_RANK_PROXIMITY_BM25 ranker, but additionally boosts the matches when they occur in the very beginning or the very end of a text field. Thus, if a field equals the exact query, SPH04 should rank it higher than a field that contains the exact query but is not equal to it. (For instance, when the query is "Hyde Park", a document entitled "Hyde Park" should be ranked higher than a one entitled "Hyde Park, London" or "The Hyde Park Cafe".)
class FoodSphinx < ActiveRecord::Base
after_save ThinkingSphinx::RealTime.callback_for(:food_sphinx)
has_many :meal_foods, foreign_key: 'foodID', primary_key: 'ndb_no'
def is_popular
...
end
end
ThinkingSphinx::Index.define :food_sphinx, :with => :real_time do
indexes long_desc, sortable: true, enable_star: true, min_infix_len: 3
has ndb_no, type: :string
#If people have made meals with that food
has meal_foods.count, as: 'mf_count', type: :integer
has is_popular, as: 'popular', type: :boolean
end
term = 'chick'
FoodSphinx.search(
"(^#{term}$) | (^#{term}*) | (#{term}*) | (#{term})",
match_mode: :extended,
ranker: :SPH04,
select: '*, weight() as w',
order: 'mf_count desc, popular desc, w desc'
)
this.$food.select2({
...
sorter: function(data) {
var firsts = [],
rest = [];
_(data).each(function(r) {
(collection.get(r.id)) ? firsts.push(r) : rest.push(r);
});
return firsts.concat(rest);
},
...
});
ThinkingSphinx::Index.define :food_sphinx, :with => :real_time do
indexes long_desc, sortable: true, enable_star: true, min_infix_len: 3
has ndb_no, type: :string
#If people have made meals with that food
has meal_foods.count, as: 'mf_count', type: :integer
has is_popular, as: 'popular', type: :boolean
###
has is_used_by_me
has times_used_by_me
has is_created_by_me
has is_used_by_my_network
###
end