You've got two issues to resolve: the data modeling and the layout design.
From a layout design point of view:
Do you want to allow users to create the tags or do you plan to specify the list of tags that can be used, but make it a very large list of tags?
Do you want to allow the user to select several tags for the same search? If so, do you want the search logic to be Or or And logic? (find all records where the contact is linked to tag 1 or tag2 vs. find all records where the contact is linked to both tag1 and tag2.)
From a data modeling perspective, you've got a many to many relation between a tags--a table where you will list each tag and the contacts table. It might look something like this:
Contacts::__pkContactID = Contact_Tag::_fkContactID
Tags::__pkTagID = Contact_Tag::_fkTagID
For designing a layout similar to what you have uploaded, you can use two portals, one to list the contacts and one to list the tags. The tag fields in the tag portal can be set up as buttons that update fields used in a portal filter expression for the contacts portal as a way to control what contacts appear in the contacts portal.