Реализация операторов поиска Google - PullRequest
3 голосов
/ 24 февраля 2010

Google в настоящее время использует ключевые слова, такие как site: или is: в поиске (второй пример из Gmail). Я пытаюсь разработать подобную систему и задаюсь вопросом, как лучше всего определить и обработать эти термины. Для простоты предположим, что используется язык ОО (Ruby, Python, Java, C # и др.).

В настоящее время я планирую создать отдельный класс для каждого ключевого слова. Эти классы имеют значение приоритета и три метода:

  1. isRelevant(String searchPhrase): Возвращает true, если поисковая фраза соответствует фильтру класса.
  2. getResults(String searchPhrase): возвращает список результатов на основе поисковой фразы.
  3. reviseSearch(String searchPhrase): возвращает измененную версию поисковой фразы. Обычно это удаляет совпадение, чтобы избежать повторной обработки экземпляром с более низким приоритетом, но может также добавить текст или полностью очистить строку.

Затем вызывающий метод будет проходить через эти фильтры ключевых слов, пока поисковая фраза не станет пустой или не останется больше фильтров (в последнем случае он вернется к своему обычному поведению поиска).

Таким образом, вопрос: это самый эффективный способ сделать это, или есть какой-то более подходящий метод? Некоторые детали еще предстоит выяснить, но является ли это шагом в правильном направлении?

1 Ответ

6 голосов
/ 25 февраля 2010

Основы

образец строки:

foo:(hello world) bar:(-{bad things}) email:something@email.tld another:weird characters +=2{-52!%#^ final:end

разделить с помощью регулярного выражения:

/\s+(?=\w+:)/

возвращаемый массив:

[
  'foo:(hello world)',
  'bar:(-{bad things})',
  'email:something@email.tld',
  'another:weird characters +=2{-52!%#^',
  'final:end'
]

регулярное выражение:

\s+     one or more spaces
(?=     followed by (positive lookahead)
  \w+   one or more word characters
  :     literal `:' (colon character)
)

использование:

Итерация по массиву, разделение каждого элемента на : (двоеточие). Левая сторона key может использоваться для вызова функции, а правая сторона value может быть передана в качестве параметра функции. Это должно в значительной степени направить вас на то, что вы хотите сделать отсюда.

Пример использования ruby ​​

search.rb

# Search class
class Search

  def initialize(query)
    @query = query
  end

  def foo(input)
    "foo has #{input}"
  end

  def bar(input)
    "bar has #{input}"
  end

  def email(input)
    "email has #{input}"
  end

  def another(input)
    "another has #{input}"
  end

  def final(input)
    "final has #{input}"
  end

  def exec
    @query.split(/\s+(?=\w+:)/).each do |e|
      method, arg = e.split(/:/)
      puts send(method, arg) if respond_to? method
    end
  end

end

использовать search.rb

q = "foo:(hello world) bar:(-{bad things}) email:something@email.tld another:weird characters +=2{-52!%#^ final:end";
s = Search.new(q)
s.exec

выход

foo has (hello world)
bar has (-{bad things})
email has something@email.tld
another has weird characters +=2{-52!%#^
final has end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...