нужна конфигурация сфинкса для нецелого первичного ключа - PullRequest
4 голосов
/ 07 октября 2011

Я хочу создать sphinx искать следующую структуру таблицы:

CREATE TABLE IF NOT EXISTS `books` (
  `productID` varchar(20) NOT NULL,
  `productName` varchar(256) NOT NULL,
  `ISBN` varchar(20) NOT NULL,
  `author` varchar(256) DEFAULT NULL,
  `productPrice` float(10,2) NOT NULL,
  `discount` float(10,2) NOT NULL,
  `brandID` int(11) NOT NULL,
  `qty` int(11) NOT NULL,
  `status` tinyint(1) NOT NULL,
  PRIMARY KEY (`productID`),
  KEY `status` (`status`),
  KEY `ISBN` (`ISBN`),
  KEY `author` (`author`),
  KEY `brandID` (`brandID`),
  KEY `books_index` (`productName`)
) ENGINE=innodb DEFAULT CHARSET=latin1;

Я не могу изменить столбец productID в таблице выше.

у меня есть таблицы зависимостей для author и Brands

CREATE TABLE IF NOT EXISTS `authors` (
      `authorID` ini(11) NOT NULL,
      `author_name` varchar(256) NOT NULL
      PRIMARY KEY (`authorID`)
    ) ENGINE=innodb DEFAULT CHARSET=latin1;


CREATE TABLE IF NOT EXISTS `brands` (
      `brandID` ini(11) NOT NULL,
      `brandName` varchar(256) NOT NULL
      PRIMARY KEY (`brandID`)
    ) ENGINE=innodb DEFAULT CHARSET=latin1;

пожалуйста, предоставьте конфигурацию для поиска sphinx.

Я использую следующую конфигурацию.

source src1
{
        type                    = mysql


        sql_query               = SELECT CRC32(productID) as productid,productID,productName,ISBN,brandID,author FROM sapna_ecom_products

        sql_attr_uint           = productID
        sql_field_string        = ISBN
        sql_field_string        = productName
        sql_field_string        = brandID
        sql_attr_multi         = uint brandID from field; SELECT brandID,brandName FROM sapna_ecom_brands
        sql_attr_multi         = uint author from field; SELECT authorID,author_name FROM sapna_ecom_authors

        sql_query_info          = SELECT productID,productName,ISBN,brandID,author  FROM sapna_ecom_products  WHERE CRC32(productID)=$id
}

Я получаю результаты, если я ищу по productName, но не по author и brand

Моя цель - получить результаты, если пользователь выполняет поиск по productName или author или brand

Пожалуйста, кто-нибудь предоставит мне подходящую конфигурацию ..

спасибо ..

1 Ответ

2 голосов
/ 07 октября 2011

Один из способов - просто сгенерировать целочисленный ключ

sql_query = SELECT CRC32(productID) AS id,...

, поскольку теперь вы не можете связать это с реальным productID, вы можете сохранить prodctID в атрибуте, чтобы получить его обратно в запросе.Результаты.

Возможно, вы можете получить коллизии с CRC32,

Быстрый запрос для проверки

CREATE TABLE test (id INT UNSIGNED NOT NULL PRIMARY KEY) SELECT CRC32(productID) FROM books;

Если это сработает, вам пора,

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

http://greenash.net.au/thoughts/2010/03/generating-unique-integer-ids-from-strings-in-mysql/


Альтернативно

sql_query_pre = SET @id := 1;
sql_query = SELECT @id := @id + 1 AS id,...
...