Создайте фильтр в Sphinx со значением text/string

у меня есть Sphinx Search установлен в качестве моей поисковой системы, и я пытаюсь добавить несколько дополнительных функций в поиск с помощью setFilter() и SetSelect() что должно позволить мне сделать WHERE/AND положения. Но всякий раз, когда я пытаюсь найти, он не возвращает результатов вместо результатов.

вот мой сфинкс.conf:http://pastebin.com/M6Kd71u0

и вот код PHP:

require("sphinxapi.php");

$host = "localhost";
$port = 9312;
$index = "llgenre";
$select1 = "cartoon";
$label6 = "children";
$type = 4;
$limit = 20;
$ranker = SPH_RANK_PROXIMITY_BM25;
$mode = SPH_MATCH_ALL;

$sphinx = new SphinxClient();
$sphinx->setServer($host, $port);
$sphinx->setConnectTimeout(0);
$sphinx->setMatchMode($mode);
$sphinx->setRankingMode($ranker);
$sphinx->setSelect('*, select1="'.$select1.'" AND label6="'.$label6.'" AS mycond');
$sphinx->setFilter('mycond', array(1));

$res = $sphinx->query($type, $index);

die(var_dump($res));

как я могу искать type = 4, фильтр select1 С cartoon и наконец-то на label6 С children?

1 ответов


Я считаю, что вы пытаетесь сделать, это фильтровать строки как атрибуты. Ссылаясь на часто задаваемые вопросы Сфинкса, они описывают процедуру

как фильтровать, сортировать или группировать по столбец string без строки атрибуты?

вы можете сделать все это, за исключением точное arbtrary-длина сортировка по несколько индексов.

для фильтрации и группировки, вы можете заменить строка с уникальным числовым идентификатором. Иногда его можно создать поиск словаря в базе данных (например. для фиксированных списков городов или страны), или даже использовать существующий во-первых, замените строки их идентификаторами в этот словарь, затем фильтр и группа на этом удостоверении. Если нет,вы всегда можете замените строку контрольной суммой, например. CRC32 В() или (любой) 64 бит берется с MD5() во время индексирования (нет необходимости переделать столы!), хранить его, используя sql_attr_uint или sql_attr_bigint соответственно, а затем фильтровать или группировать на этот атрибут контрольной суммы. (обратите внимание, что существует определенный шанс CRC32() столкновения, если у вас миллионы строки, но практически нулевой шанс MD5() и столкновений.)

Итак, в моем Сфинксе.conf, у меня может быть следующее...

sql_query = SELECT CRC32(string_field) AS `string_field` FROM `table`

sql_attr_uint = string_field

тогда в PHP я бы применил фильтр к полю так...

$sphinx->SetFilter('string_field', array(crc32( 'filter_string' ));

--

к сожалению, PHP имеет раздражающую проблему (ошибка?) при конвертации в crc32... что-то связанное целые числа без знака или что-то в этом роде..

я использую следующую функцию для преобразования правильно

class Encode {
    public static function crc32($val){
        $checksum = crc32($val);
        if($checksum < 0) $checksum += 4294967296;
        return $checksum;
    }
}

--

будьте осторожны с характером! Вы можете преобразовать столбец в нижний регистр при индексировании, например.

sql_query = SELECT CRC32(LOWER(string_field)) AS `string_field` FROM `table`

и поиск...

$sphinx->SetFilter('string_field', array(crc32(strtolower( 'Filter_String' )));