3

Поиск:Синтаксический и форматирование результаты поиска

Scripting + Язык Web + страницы Приложения

Результаты:

... язык сценариев первоначально ... производить динамический веб-страницы. Он имеет ... графические приложения .... универсальный язык сценариев что ... d создание веб-страниц как выход ...

Предположим, что я хочу, значение, представляющее количество символы, которые можно указать в качестве дополнения по обе стороны от согласованных терминов, а другое значение, которое представляет, сколько совпадений будет отображаться в результате (т. е. я хочу видеть только первые 5 совпадений, не более того).

Как именно будет вы идете об этом?

Это довольно язык-агностик, но я буду реализовывать это решение в среде PHP, поэтому, пожалуйста, ограничьте ответы на параметры, которые не требуют определенного языка или фреймворка.

Вот мой мыслительный процесс: создать массив из поисковых слов. Определите, какое поисковое слово имеет самый низкий показатель относительно того, где он найден в теле статьи. Соберите ту часть тела в другую переменную, а затем удалите этот раздел из тела статьи. Вернитесь к шагу 1. Вы даже можете добавить счетчик к каждому слову, пропустив его, когда счетчик достигнет 3 или около того.

Важен:

Решение должно соответствовать всем условиям поиска в нелинейно. Смысл, термин следует искать после второго срока, если он существует после второго срока. Аналогично, он должен быть найден и после термина 3. Термин 3 должен быть найден до термина 1 и 2, если он существует до них.

Решение должно позволить мне объявить «Разрешить до трех совпадений для каждого термина, а затем завершить резюме».

Экстра Кредит:

Получить заполнени-переменную необязательно пэдов слова, а не символов.

+0

ли позиция означает слово/термин положение или характер позиция ? – KenE

+0

strpos() получает индекс первого символа. – Sampson

ответ

-1

Лично я хотел бы преобразовать поисковые термины в регулярные выражения, а затем использовать Regex Find-Replace, чтобы обернуть совпадения сильными тегами для форматирования.

Скорее всего, маршрут RegEx был бы лучше всего. Таким образом, в вашем примере вы получите три отдельных значения RegEx.

Поскольку вы хотите решение, не зависящее от языка, я не буду использовать здесь реальные выражения, поскольку точный синтаксис зависит от языка.

1

Мой мыслительный процесс:

  1. Создать массив результатов, который поддерживает неуникальным пары имя/значение (PHP поддерживает это в стандартной array объекта)
  2. Петля через каждый термин поиска и найти его начальный символ позиция в тексте поиска
  3. Добавить элемент в массив результатов, который хранит эту позицию символа, которую он только что нашел с фактическим поисковым термином, как ключ
  4. Когда вы нашли все условия поиска, отсортируйте массив по возрастанию позначение (позиция символа поискового запроса)
  5. Теперь результаты поиска будут в порядке их нахождения в тексте поиска
  6. Прокрутите массив результатов и используйте указанное слово padding, чтобы получить слова с каждой стороны термин поиска, а также отслеживать количество слов в паре отдельного имени/значения

псевдокод, или моя лучшая попытка на него:

function string GetSearchExcerpt(searchText, searchTerms, wordPadding = 0, searchLimit = 3) 
{ 
    results = new array() 
    startIndex = 0 
    foreach (searchTerm in searchTerms) 
    { 
    charIndex = searchText.FindByIndex(searchTerms, startIndex) // finds 1st position of searchTerm starting at startIndex 
    results.Add(searchTerm, charIndex) 
    startIndex = charIndex + 1 
    } 
    results = results.SortByValue() 
    lastSearchTerm = "" 
    searchTermCount = new array() 
    outputText = "" 
    foreach (searchTerm => charIndex in results) 
    { 
    searchTermCount[searchTerm]++ 
    if (searchTermCount[searchTerm] <= searchLimit) 
    { 
     // WordPadding is a simple function that moves left or right a given number of words starting at a specified character index and returns those words 
     outputText += "..." + WordPadding(-wordPadding, charIndex) + "<strong>" + searchTerm + "</strong>" + WordPadding(wordPadding, charIndex) 
    } 
    } 

    return outputText 
} 
Смежные вопросы