Я думаю, что лучшим подходом может быть использование %
вместо пробелов при поиске, и я считаю, что это обычно дает мне лучшие результаты.Вот документы для ILIKE в Postgres , но я объясню на примере.Символ %
, используемый в ILIKE
, соответствует любой строке символов (включая пустую строку).
SELECT * FROM t1 WHERE col_name ILIKE '%test%data%';
Приведенный выше запрос будет соответствовать приведенному вами примеру.Конечно, он также будет соответствовать строкам, таким как "testdata"
, "test data"
, "something test something data"
, но я думаю, что в целом этот подход будет возвращать результаты, которые пользователь ожидает при вводе поиска, например "test data"
.
Вспомогательная функция для выполнения этого преобразования из пользовательского ввода в строку, подходящую для Ecto ilike
, будет выглядеть следующим образом:
defmodule SearchHelpers do
def to_ilike_search_string(search_string) do
joined_string =
search_string
|> String.split()
|> Enum.join("%")
"%#{joined_string}%"
end
end
# SearchHelpers.to_ilike_search_string("test data")
# => "%test%data%"
И вы можете использовать ее в запросе, подобном этому:
ilike_search_string = SearchHelpers.to_ilike_search_string("test data")
query = from p in Post,
where: ilike(p.content, ^ilike_search_string)
results = Repo.all(query)
Удачи, надеюсь, это поможет.