MySQL полнотекстовый поиск - обходной путь для числовых значений и ft_min_word_len - PullRequest
0 голосов
/ 10 марта 2011

Я использую полнотекстовый поиск MySQL IN BOOLEAN MODE, но сталкиваюсь с проблемами с числовыми значениями в строках поиска из-за предела ограничения символов, который устанавливается параметром ft_min_word_len в my.cnf (в настоящее время на этом сервере установлено значение 3)).Есть ли обходной путь, чтобы поиск типа «что-то 14» выполнял поиск «чего-то» и «14» (или даже «четырнадцати»), так как в настоящее время ограничение символов означает, что числа длиной до 3 цифр игнорируются.В связи с тем, что числовые фрагменты в строках поиска важны, нам нужно уменьшить ft_min_word до 1, чтобы все поиски возвращали правильные результаты, и это сделало бы индексацию чрезвычайно медленной.Потенциальным решением было бы сделать замену чисел их эквивалентным словом с помощью PHP и убедиться, что это слово также добавлено в текст с возможностью поиска, но это кажется хакерским.

Есть ли другие идеи?

1 Ответ

1 голос
/ 24 марта 2011

Да, я столкнулся с этой проблемой несколько лет назад и использовал это решение для своих клиентов.С точки зрения результатов, он работает очень хорошо.

По сути, он разбивает все, что меньше 3 символов, на поиск LIKE, а все, что больше 3 символов, на полнотекстовый логический поиск.В настоящее время я работаю над выпуском моей версии многоуровневого поискаНо пока я не закончу.Я разместил полный текст его части, чтобы вы могли использовать код.Если у вас есть какие-либо проблемы или сделать это лучше.Я просто прошу вас опубликовать его на моем сайте Project Hosted, чтобы он стал лучше.

Полная функция показана по ссылке источника.

$parseQuery = explode(" ",$query);
foreach($parseQuery as $key => $qvalue)
{
        if(strlen($qvalue) > 3)
        {
                $buildQuery .= "$qvalue ";
        }
        elseif(strlen($qvalue) >= 2)
        {
                $buildLike[] = "`blog` LIKE '%$qvalue%'";
        }
}

if($buildLike != "")
{
$numCountQuery = 0;
        $countforbuilding = count($buildLike) - 1;
        foreach($buildLike as $key => $queryforLike)
        {
                if($numCountQuery != $countforbuilding)
                {
                        $finalBuildLike .= "$queryforLike AND";
                }
                else
                {
                        $finalBuildLike .= "$queryforLike";
                }
                $numCountQuery++;
        }
} 
if(($finalBuildLike != "") && ($buildQuery != ""))
{
$finalBuildLike = "AND $finalBuildLike";
}

if($buildQuery != "")
{
$buildDescription = $buildQuery;
$buildQuery = "MATCH(blog) AGAINST ('".trim($buildQuery)."')";
}

http://code.google.com/p/php-mysql-layered-search/

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...