diff --git a/lib/membership/member.ex b/lib/membership/member.ex index c62c47d..9f4f2f5 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -138,6 +138,7 @@ defmodule Mv.Membership.Member do contains(postal_code, ^q2) or contains(house_number, ^q2) or contains(phone_number, ^q2) or + contains(city, ^q2) or ilike(city, ^pat) or fragment("? % first_name", ^q2) or fragment("? % last_name", ^q2) or fragment("? % street", ^q2) or diff --git a/lib/mv_web/live/member_live/index.ex b/lib/mv_web/live/member_live/index.ex index fccd67f..0e0c558 100644 --- a/lib/mv_web/live/member_live/index.ex +++ b/lib/mv_web/live/member_live/index.ex @@ -192,7 +192,10 @@ defmodule MvWeb.MemberLive.Index do defp apply_search_filter(query, search_query) do if search_query && String.trim(search_query) != "" do query - |> filter(expr(fragment("search_vector @@ plainto_tsquery('simple', ?)", ^search_query))) + |> Mv.Membership.Member.fuzzy_search(%{ + query: search_query, + fields: [:first_name, :last_name, :street] + }) else query end diff --git a/test/membership/fuzzy_search_test.exs b/test/membership/fuzzy_search_test.exs index 9e746d3..4506492 100644 --- a/test/membership/fuzzy_search_test.exs +++ b/test/membership/fuzzy_search_test.exs @@ -161,4 +161,30 @@ defmodule Mv.Membership.FuzzySearchTest do ids = Enum.map(result, & &1.id) assert s1.id in ids end + + test "substring in city matches mid-string" do + {:ok, b} = + Mv.Membership.create_member(%{ + first_name: "City", + last_name: "One", + email: "city1@example.com", + city: "Berlin" + }) + + {:ok, _m} = + Mv.Membership.create_member(%{ + first_name: "City", + last_name: "Two", + email: "city2@example.com", + city: "München" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "erl"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert b.id in ids + end end