2017-01-25 6 views
1

Текущая ситуация:PHP/SQL: Множественный поиск нечеткий ключевых слов на основе на подобии (Advanced SQL Search)

Я в настоящее время работает поиск по ключевым словам, используя несколько ключевых слов в PHP и SQL. В поле, к которому я применяю поиск, относится поле , которое является полем 250 VARCHAR.

Пользователь может ввести одно ключевое слово, например. «яблоко» или также несколько, например. «яблочный банановый жёлтый». Первый вариант тривиален. Для второго варианта мой текущий алгоритм работает следующим образом:

  1. Попробуйте найти элементы, которые соответствуют полной строке "apple banana yellow" в названии. Закажите результаты по индексу id.
  2. Если не найдено больше результатов, соответствующих полной цельной строке, или, если они не найдены, найдите все заголовки, содержащие «яблоко», «банан» или «желтый». Закажите результаты по индексу id.

Алгоритм очень простой, но достаточно забавный, работает довольно хорошо.


Что я ищу:

Однако сейчас я ищу осуществить умнее алгоритм поиска без необходимости полагаться на внешний заплатил скрипты, такие как услуги Amazon. Я ищу способ осуществить следующее:

  • нечеткий поиск (я читал SOUNDEX или Левенштейн, которые могут реализовать это)
  • умнее поиск ключевого слова (Не просто либо возвращать элементы, которые соответствуют всем словам или JUST A SINGLE WORD, но, возможно, еще 2 слова или 3 слова раньше)
  • порядок по релевантности/сходству (заказ по сходству поиска по названию, а не только по индексу)
  • (Бонус: может даже выполнить поиск точных строк, например, используя «» в google, чтобы точно найти слова между кавычками)

Что лучше всего начать с такого поиска? Я использую InnoDB для MySQL.

+0

Какую систему SQL вы ударять? Вы используете MySQL, ORACLE? – Ray

+0

@ Извините, я использую InnoDB для MySQL. Я отредактирую свой пост. –

+1

Возможно, вас заинтересует http://sphinxsearch.com/, который может сидеть на вершине mysql – Mihai

ответ

1

Предполагая MySQL, вы можете добавить индекс FULL Text. Затем, существует целый ряд функций, которые позволят вам так основные запросы, которые отвечают всем потребностям вы перечисляете: https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html

Вы в конечном итоге, используя синтаксис, как:

SELECT * FROM table_name WHERE MATCH(column_with_fulltext_index_on_it) 
     AGAINST('apple banana yellow' IN NATURAL LANGUAGE MODE) 

Чтобы посмотреть матч оценка

SELECT column_with_fulltext_index_on_it, MATCH(column_with_fulltext_index_on_it) 
     AGAINST('apple banana yellow' IN NATURAL LANGUAGE MODE) AS score FROM table_name WHERE MATCH(column_with_fulltext_index_on_it) 
     AGAINST('apple banana yellow' IN NATURAL LANGUAGE MODE) 

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

Также следует отметить, что существуют системные конфигурации, необходимые для управления символами min/max слов/токенов для индексации. Вы можете прочитать https://dev.mysql.com/doc/refman/5.7/en/fulltext-fine-tuning.html, чтобы получить более глубокое понимание параметров индексирования. Percona также является хорошим ресурсом https://www.percona.com/blog/2013/02/26/myisam-vs-innodb-full-text-search-in-mysql-5-6-part-1/ (как правило, более удобоваримый человек, чем MySQL Doc).

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

Вот хороший учебник: http://www.w3resource.com/mysql/mysql-full-text-search-functions.php

+0

Привет, спасибо, это выглядит очень перспективно! Как вы считаете, основные преимущества использования Solr вместо FULL Text Indexes? –

+0

Вероятно, слишком много преимуществ для определенных сценариев, которые перечислены здесь. Solr - это хранилище данных, использующее Lucine, которое строится вокруг поиска. Mysql - это реляционная БД с некоторыми функциями поиска, но если они отвечают вашим потребностям, не позволяйте вам принять вторую технологию. – Ray

+0

Amazon Elastisearch также реализует Lucene, поэтому вы также можете использовать это, если не хотите поддерживать свою собственную систему Solr. – Ray