2014-09-05 4 views
1

Ниже приведены команды, которые я побежалполнотекстовый поиск не дает желаемого результата

create database fu; 

create table table_name(name varchar(10)); 

insert into table_name values('karan'); 

insert into table_name values('nitin');  

insert into table_name values('orip'); 

insert into table_name values('karan orip'); 

insert into table_name values('karan nitin'); 

alter table table_name add fulltext(name); //fulltext 

select * from products where match(name) against('karan'); 

Теперь, приведенный выше запрос возвращает меня пустое множество. Почему это?

Кроме того, это я

select * from products where match(name) against('karan' in boolean mode); 

выше утверждение дает мне идеальный результат.

ответ

1

Возможно, вы используете механизм хранения MyISAM. Существует ограничение на то, что слова, найденные более чем в 50% всех строк, будут рассматриваться как стоп-слова:

Ваше искомое слово «karan» находится в 3 из 5 рядов, поэтому оно над этой отметкой.

MyISAM Ограничение
Для очень маленьких таблиц, слово распределения не адекватно отражает их смысловое значение, и эта модель может иногда производить странные результаты поиска индексов для таблиц MyISAM. Для Например, хотя слово «MySQL» присутствует в каждой строке таблицы изделия, показанного ранее, поиск слова в поисковой MyISAM индекса не дает никаких результатов:

[...]

Результат поиска пуст, поскольку слово «MySQL» присутствует в наименее 50% строк и поэтому эффективно рассматривается как секундомер. Этот метод фильтрации более подходит для больших наборов данных, где может не потребовать, чтобы результирующий набор возвращал каждую вторую строку из таблицы 1GB , чем для небольших наборов данных, где это может привести к плохим результатам для популярных терминов.

Вы можете обойти эту проблему с помощью двигателя InnoDB, если вы используете MySQL 5.6 или новее.

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

из MySQL manual, Natural Language Full-Text Searches

+0

Ох, на самом деле я шел по http://www.vionblog.com/mysql-full-text-search-with-multiple-words/ в этом блоге, и там говорится, что я должен использовать MyISAM – Kraken

+0

Так как MySQL 5.6 есть поддержка FULLTEXT от InnoDB. – VMai

0

Из-за ограничения и проблемы производительности в MySQL встроенного полнотекстовых индексов поиска я предложил бы использовать внешний полнотекстовой двигатель, как сфинкс или Lucene/Solr. Оба они придадут вам гораздо большую скорость и лучшую функциональность и релевантность. Это будет обязательно, если вы планируете искать большой объем данных, и в этом случае поиск в MySQL FT может занять несколько секунд, тогда как внешние системы, основанные на инвертированном индексе, могут искать гиды данных с миллисекундами.

Solr написан на Java и требует JVM, поэтому может быть хорошим выбором, если вы уже используете Java в своем приложении. Sphinx написан на C++, работает как демон и поддерживает протокол MySQL, поэтому с ним можно работать немного легче. Вы можете получить представление о том, как использовать Sphinx здесь: http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/ Sphinx также поддерживает фрагменты (выделение результатов), которые могут быть полезны.

В любом случае при использовании внешней поисковой системы вы все равно можете запросить MySQL для извлечения метаданных для найденных документов.

+0

Sphinx/Lucene - это не базы данных? Я все равно буду использовать MySQL для хранения db. – Kraken

+0

Да, вы правы. Они - поисковые системы и не предназначены для хранения даты так же хорошо, как MySQL. – vfedorkov

Смежные вопросы