2015-05-14 6 views
7

sto cercando di ottenere un ecto come query di lavorare in questo modo:Ecto dove come interrogazione in cui agisce come ==

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 

Nel mio tavolo, ho una company_name "Asymptote". Utilizzando dove: come/2 la mia domanda è simile al seguente:

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

quando la ricerca pg_trm senza commenti, sembra che questo:

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

Per quanto posso vedere, le query sembrano buoni, ma non ci sono risultati Da quando ho aggiunto l'indice dopo aver aggiunto "Asymptote" al database, mi aspetto che sia per questo che non si trova nell'indice pg_trm, ma perché non piacerà/2 o ilike/2? Quando inserisco il nome completo "Asymptote", sono in grado di trovare il record.

+0

Penso che questo sia un problema con il limite di corrispondenza di similarità predefinito con pg_trgm. È in grado di trovare valori più brevi nella colonna company_name (come "google"), quindi penso che questo sia un problema con il parametro limit di default. come/2 non dovrebbe funzionare in quel modo però –

risposta

0

Con l'aiuto di Mitchell Henke di Rokkincat, ecco un modo per ottenere pg_trgm lavorare con Partita personalizzata percentuali:

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 

Ma ancora non può ottenere come/2 di lavoro. Inoltre, non vedo dove esista questa funzione in Ecto.

9

Ho affrontato un problema simile. Purtroppo non ho avuto nessun pg_trgm disponibile. Ho usato il LIKE come:

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

Questo corrispondeva al testo in qualsiasi luogo del candidato.first_name.

Problemi correlati