2015-05-14 2 views
7

Я пытаюсь получить экто как запрос работает так:Ecto где, как запрос действует как где ==

def find(searchterm) do 
    query = from c in Contact, 
    #where: fragment("? % ?", c.company_name, ^searchterm), 
    where: like(c.company_name, ^searchterm), 
    contacts = Repo.all(query) 
    {:ok, contacts} 
end 

В моей таблице, у меня есть COMPANY_NAME «асимптота». Использование где: как/2 мой запрос выглядит следующим образом:

SELECT c0."id", c0."company_id", c0."company_name" FROM "contacts" AS c0 WHERE (c0."company_name" LIKE $1) ["Asym"] (1.0ms) 

при поиске pg_trm раскомментирована, это выглядит следующим образом:

SELECT c0."id", c0."company_id", c0."company_name" FROM "contacts" AS c0 WHERE (c0."company_name" % $1) ["Asym"] (1.0ms) 

Насколько я могу видеть, запросы выглядят хорошо, но результатов нет. Поскольку я добавил индекс после добавления «Асимптота» в базу данных, я ожидаю, что именно поэтому он не найден в индексе pg_trm, но почему не понравится/2 или ilike/2? При вводе полного имени «Асимптота» я могу найти запись.

+0

Я думаю, что это проблема с лимитом соответствия подобия по умолчанию с pg_trgm. Он способен находить более короткие значения в столбце company_name только отлично (например, «google»), поэтому я думаю, что это проблема с параметром ограничения по умолчанию. как/2, не должно работать так, хотя –

ответ

0

С помощью Mitchell Хенке из Rokkincat, вот способ получить pg_trgm работы с пользовательскими процентами спичечных:

def find(searchterm) do 
    limit = 0.1 
    query = from c in Contact, 
    where: fragment("similarity(?, ?) > ?", c.company_name, ^searchterm, ^limit), 
    #where: like(c.company_name, ^searchterm), 
    contacts = Repo.all(query) 
    {:ok, contacts} 
end 

Но я до сих пор не могу получить как/2 работы. Кроме того, я не вижу, где в источнике Ecto эта функция существует.

9

У меня возникла аналогичная проблема. К сожалению, у меня не было pg_trgm. Я использовал LIKE как в:

from candidate in query, 
    where: like(candidate.first_name, ^("%#{text}%")) 

Это соответствовало тексту в любом месте кандидата.first_name.

Смежные вопросы