Search for text pattern in a list

Hello All,
I am building a small website using Elixir/Phoenix and Mnesia as the backend database. The site is simple so mnesia works for us. I added ecto3_mnesia to use some of the Ecto’s functionality. Everything works great. We ran into a small issue when trying to search for a text. sort of like Postgresql’s like functionality.

Is there anyway to use like with mnesia?. If that is not an option, how can i search for a pattern using Enum? i.e., if i have a list of maps, I want to search for a text within some fields in the map.

Appreciate your help.
Regards,
Phunsukh

It would help if you could show us an example of what you’re trying to accomplish. A sample list of maps and what kind of text are you trying to find. Also what have you tried so far.

1 Like

I’m sure Mnesia provides a proper way to do it, but just to answer your second question about Enum, you can easily search through maps with something like:

Enum.filter(
  list_of_maps,
  &Enum.find(&1, fn {_key, value} ->
    String.contains?(value, search_query)
  end)
)

This will return all maps where search_query was found in the values. If you only want to return the first map where search_query was found, just replace Enum.filter with Enum.find. In this naive example it will search all fields because key is ignored, but you could search specific fields with a variety of simple methods, such as pattern matching, adding a guard, or simply Kernel.and/2. And if it’s just a single field you can remove Enum.find entirely:

Enum.filter(list_of_maps, fn m ->
  String.contains?(m[search_field], search_query)
end)
1 Like