Как опустить «THE» в поиске, используя PHP и MYSQL - PullRequest
4 голосов
/ 10 марта 2010

Я выполняю модуль "ПОИСК АЛЬФАБЕТИЧЕСКИХ ЗАКАЗОВ" для проекта.

то есть это будет выглядеть

A B C D E F. , , , , , , , , ... , , , , , ... , , Z

Когда я нажимаю " A ", результаты должны быть отсортированы по " A ". Что одинаково для всех алфавитов.

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

  • Например, есть фильм под названием " Мумия ".

  • Что я делаю, когда нажимаю на « ALPHABET T », этот соответствующий фильм будет сортироваться.

  • Но мое клиентское требование заключается в том, что фильм " Мумия" должен сортироваться, когда пользователь нажимает "М", а не "Т"

  • Поскольку "a, an," являются "СТАТЬЯМИ", и оно не имеет никакого значения.

Надеюсь, теперь все могут понять, в чем моя проблема ...

Любая помощь будет ощутимой и благодарной.

заранее спасибо

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

То, что вы на самом деле спрашиваете здесь, это как убрать "стоп-слова" ("the" - это только один пример; вы хотите удалить "of", "a" и т. Д.). Пытаться жестко закодировать набор стоп-слов - ОГРОМНАЯ боль в заднице, и по мере изменения вашего корпуса вам придется изменить код.

Вместо этого вы должны попытаться использовать алгоритм, который будет определять, какие стоп-слова основаны на вашем корпусе. Алгоритмы для такого рода вещей хорошо известны и используются поисковыми системами. Тот, который работает очень хорошо, называется TF / IDF

2 голосов
/ 10 марта 2010

В основном, как вы это делаете, у вас есть дополнительный столбец для сортировки. Если у вас есть таблица movie со столбцом name, добавьте еще один столбец с именем sort_name. Это должно содержать название фильма в нижнем регистре с любыми словами, которые вы хотите игнорировать с передней части удалены (например, "the", "a").

Не пытайтесь делать это динамически.

Когда поле будет обновлено, вам также придется обновить столбец sort_name. Вы можете восстановить его в любое время, и вам, конечно, придется проиндексировать его. Тогда просто сделайте:

SELECT *
FROM movies
WHERE sort_name LIKE 'a%'
2 голосов
/ 10 марта 2010

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

SELECT Title
FROM myTable
WHERE (Title LIKE 'x%' OR Title LIKE 'THE x%')
  -- AND Title NOT LIKE 'THE [^T]%'   
ORDER BY Title

Примечания:
- х обозначить нужную букву (пример: LIKE 'A%' и т. д.)
- Дополнительное условие «И НАЗВАНИЕ НЕ НРАВИТСЯ» требуется только в том случае, если «Х» - это буква «Т» (в противном случае функционально избыточно, но не меняет результат)
- Я не уверен в поддержке [^xyz] (то есть NOT символов x, y или z), поэтому [^T] можно заменить его положительным эквивалентом, скажем, [A-RS-Z0-9].

Есть несколько других стоп-слов, которые следует учитывать («A», «AN», «OF» ...), но для названий книг или фильмов принято считать только «THE». Если вам нужно разобраться с другими статьями, логику можно расширить так:

SELECT Title
FROM myTable
WHERE (Title LIKE 'x%' 
    OR Title LIKE 'THE x%' 
    OR Title LIKE 'A x%' 
    OR Title LIKE 'AN x%') 
 -- the following is only needed when "x" is either the letter T or A.
 -- AND (Title NOT LIKE 'THE [^T]%' 
 --      AND Title NOT LIKE 'A [^A]%' 
 --      AND Title NOT LIKE 'AN [^A]%'
 --  )
ORDER BY Title



Существуют лучшие решения, , если вы можете изменить содержимое таблицы . Некоторые из них предполагают предварительное вычисление одного или нескольких дополнительных столбцов (и их сохранение / добавление при добавлении новых записей и т. Д.).

  • См., Например, ответ Cletus в этом посте для подхода "sort_column", где дополнительный столбец содержит заголовок, лишенный любого нежелательного начального шумового слова. В дополнение к своему назначению в качестве поля фильтрации в исходной задаче поиска букв в ОП, этот столбец также может использоваться для более удобной / разумной сортировки списков названий, которые были созданы фильтром, не связанным с исходным письмом. и / или начало названия (например, поиск по году).
  • Вариант вышеописанного состоит в том, чтобы хранить только «эффективную» начальную букву (букву за пределами нежелательного шума), что делает столбец меньшего размера, но также и менее универсальным.
  • Сам столбец заголовка может быть обновлен, сохраняя измененную форму заголовка, в результате чего постороннее ведущее шумовое слово (а) перемещается в конец строки, между скобками. Эта практика довольно распространена в каталогах библиографического типа.
...