Экто нечеткое совпадение на нескольких словах - PullRequest
0 голосов
/ 30 апреля 2019

В моей БД (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 сопоставить имя на пробелах и левенштейновое совпадение по результату, но я не уверен, как это сделать.

...