2014-01-07 7 views
3

У меня есть приложение Rails4 с Postgresql (PG_search) на MAC. Я создал словарь синонимов через миграцию рельсов. Словарь синонимов несколько работает. Настройка нижеRails Postgresql - словарь синонимов несколько не обновляется

Миграции

CREATE TEXT SEARCH DICTIONARY custom_synonyms_for_keywords (TEMPLATE = synonym, SYNONYMS = synonyms_for_keywords); 
CREATE TEXT SEARCH CONFIGURATION simple_syns_keywords (copy=simple); 
ALTER TEXT SEARCH CONFIGURATION simple_syns_keywords ALTER MAPPING FOR asciiword WITH custom_synonyms_for_keywords; 

my_synonyms файл:
fshk bim24os
холодильник холодильник
Postgres PGSQL
PgSQL
PostgreSQL индексы индекса *

Контроллер

class Product < ActiveRecord::Base 
    pg_search_scope :pg_search, against: :sku, 
     using: { 
      tsearch: { prefix: true, dictionary: "simple_syns_keywords" } 
     } 
end 

Когда я бегу

Product.pg_search("fshk") # returns record of "bim24os" 
Product.pg_search("fridge") # returns no record of "refrigerator" 

Но когда я запускаю это, она возвращает правильное значение

SELECT ts_lexize('custom_synonyms_for_keywords', 'fshk'); # returns "bim24os" 
SELECT ts_lexize('custom_synonyms_for_keywords', 'fridge'); # returns "refrigerator" 

РЕЗУЛЬТАТЫ

Product.pg_search("fshk") 
    Product Load (3.0ms) SELECT "products".*, ((ts_rank((to_tsvector('simple_syns_keywords', coalesce("products"."sku"::text, ''))), (to_tsquery('simple_syns_keywords', ''' ' || 'fshk' || ' ''' || ':*')), 0))) AS pg_search_rank FROM "products" WHERE (((to_tsvector('simple_syns_keywords', coalesce("products"."sku"::text, ''))) @@ (to_tsquery('simple_syns_keywords', ''' ' || 'fshk' || ' ''' || ':*')))) ORDER BY pg_search_rank DESC, "products"."id" ASC 
=> #<ActiveRecord::Relation [#Product id: 1, sku: "BIM24OS"] 

Product.pg_search("fridge") 
    Product Load (1.8ms) SELECT "products".*, ((ts_rank((to_tsvector('simple_syns_keywords', coalesce("products"."sku"::text, ''))), (to_tsquery('simple_syns_keywords', ''' ' || 'fridge' || ' ''' || ':*')), 0))) AS pg_search_rank FROM "products" WHERE (((to_tsvector('simple_syns_keywords', coalesce("products"."sku"::text, ''))) @@ (to_tsquery('simple_syns_keywords', ''' ' || 'fridge' || ' ''' || ':*')))) ORDER BY pg_search_rank DESC, "products"."id" ASC 
=> ActiveRecord::Relation [] 

У меня нет шага, потому что я не уверен, почему он не работает. Любая помощь приветствуется.

Благодаря

+0

Пожалуйста, покажите запрос SQL, который Rails генерирует для обоих запросов продукта. Также, пожалуйста, покажите оригинальные операторы 'CREATE' для' my_synonyms'. –

+0

i обновил вопрос с результатами поиска –

+0

Добавили холодильник? Я считаю, что словари кэшируются для каждого соединения - перезапуск консоли изменит результаты? –

ответ

0

Понял работает, добавив «простой» в третьей строке моего SQL миграции.

От

ALTER TEXT SEARCH CONFIGURATION simple_syns_keywords 
    ALTER MAPPING FOR asciiword 
    WITH custom_synonyms_for_keywords; 

Для

ALTER TEXT SEARCH CONFIGURATION simple_syns_keywords 
    ALTER MAPPING FOR asciiword 
    WITH custom_synonyms_for_keywords, simple; 
Смежные вопросы