В моей БД (PostgreSQL) я добавил расширение fuzzystrmatch
и пытался использовать функцию levenshtein
для сопоставления элементов.Это не работает так, как мне хотелось бы, когда столбцы представляют собой строки из нескольких слов.
Код:
def fuzzy_search(query_string, threshold \\ 4) do
query_string = query_string |> String.downcase()
query =
from item in MyApp.Item,
where:
levenshtein(item.name, ^query_string, ^threshold) or
levenshtein(item.quote, ^query_string, ^threshold),
order_by:
fragment(
"LEAST (?, ?)",
levenshtein(item.name, ^query_string),
levenshtein(item.quote, ^query_string)
)
MyApp.Repo.all(query)
end
Код работает (Левенштейн - просто макрос для цитируемого запроса) но моя проблема заключается в столбце name
этих пунктов.Названия предметов, такие как «Lodestone Ammolet», не совпадают с поиском «lodestone», так как второе слово имеет слишком большое значение.
Если я увеличу пороговое значение, оно просто выдаст слишком много совпадений, которые не соответствуютактуально.Какой лучший подход для решения этой проблемы?Я мог думать только о том, чтобы попытаться split
сопоставить имя на пробелах и левенштейновое совпадение по результату, но я не уверен, как это сделать.