This took a little digging around in the code but I got exact match to work, now I can wrap it in a "get id" function. Here is an example using fuzzy and exact searches.
from config import Config
from arcgis.gis import GIS
portal = GIS(Config.PORTAL_URL, Config.PORTAL_USER, Config.PORTAL_PASSWORD)
print("Logged in as " + str(portal.properties.user.username))
q='title:"Vector Tile Layer"'
fuzzy = portal.content.search(query=q)
connection = portal._con # I understand, this is private and could change
params = {'q': '', 'filter': q}
exact = connection.post(Config.PORTAL_URL + '/sharing/rest/search', params)
print("Fuzzy matches:", len(fuzzy))
print("Exact matches: %d ID: %s" % (res['total'], res['results'][0]['id']))
Output looks like this:
Logged in as bwilson@CLATSOP
Fuzzy matches: 4
Exact matches: 1 ID: b69b15dbf53c459a9e709bde764aaefa
All the same options that work for the search and advanced_search methods can be passed in the "params" dictionary. If Esri would simply put an additional "filter" argument into those methods, they would work since all this code does is go directly to the post() call that's buried in those methods.