Эликсир: как искать в базе данных двойные пробелы - PullRequest
0 голосов
/ 12 октября 2018

В моем интерфейсе отображения данных только один пробел.Однако, когда я фильтрую свои данные в строке поиска, это не дает результата.Оказывается, данные на самом деле имеют двойные пробелы.Но когда все repo.all, двойные пробелы становятся единичными пробелами.Мне нужно искать эти данные.

У меня есть регулярное выражение, которое я нашел, что я попробовал в pgadmin, который работает.Мне нужно воспроизвести его в моем эликсире данных для конкретной интеграции его в функцию илике.

регулярное выражение

SELECT trim(regexp_replace(name, '\s+', ' ', 'g')) as col_name
FROM table where col_name = 'TEST  DATA'

1 Ответ

0 голосов
/ 12 октября 2018

Я думаю, что лучшим подходом может быть использование % вместо пробелов при поиске, и я считаю, что это обычно дает мне лучшие результаты.Вот документы для 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)

Удачи, надеюсь, это поможет.

...