Булевый поиск MySQL - как отфильтровать все результаты, которые не содержат как минимум 2 входные строки? - PullRequest
2 голосов
/ 18 марта 2012

Кто-нибудь знает, как сузить булевские результаты поиска MySQL Match / Against , чтобы получить только те записи, которые содержат не менее 2 входных слов?

Это запрос:

   SELECT it_title, en_title, genre, author, year, place, movie_id, url, place_it
        . FROM movies, locations, sets
        . WHERE MATCH (movies.it_title) AGAINST('$loc' IN BOOLEAN MODE)

Я хотел бы получить только те совпадения, у которых есть хотя бы 2 набранных слова, скажем:

  • Если пользователь вводит: "полночь", я бы хотел избежать "полуночи в Париже"
  • Если пользователь наберет: "полночь", я бы хотел показать это.

Ура, Elisa

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Это может быть сложно в вашем примере. Полнотекстовый поиск MySQL имеет минимальную длину слова (по умолчанию 4), поэтому «in» не будет проиндексировано по умолчанию. «in» также является одним из стоп-слов по умолчанию, поэтому снова не будет проиндексировано по умолчанию. А как насчет одноразовых фильмов? Поиск на естественном языке - общеизвестно сложная тема (Google посвятил годы тому, чтобы разработать правильные алгоритмы). Я бы рекомендовал НЕ создавать свои собственные алгоритмы.

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

0 голосов
/ 19 марта 2012

В вашем случае просто посчитайте слова для $ loc, например, если вы используете php, сделайте оператор if с str_word_count ($ loc)> = 2

Это то, что я нашел на этот сайт о поиске по нескольким словам для соответствия.

После небольшого исследования я обнаружил, что если вы хотите искать по нескольким ключевым словам, вы можете просто добавить пробел между каждым словом.Поэтому, если я хочу выполнить полнотекстовый поиск в таблице по словам «яблоко, автозапчасти и одежда», я бы написал так.

select * from tbl_name where match (col1, col2) AGAINST ('apple "auto parts" apparel' IN BOOLEAN MODE) 
...