Сфинкс без использования идентификатора auto_increment - PullRequest
5 голосов
/ 29 октября 2009

В настоящее время я планирую создать большую базу данных (более 2 миллионов строк) с различными данными из отдельных источников. Я хотел бы избежать структурирования базы данных с помощью идентификаторов auto_increment, чтобы предотвратить возникновение проблем с синхронизацией при репликации, а также потому, что каждый вставленный элемент будет иметь буквенно-цифровой код продукта, который гарантированно будет уникальным - мне кажется, что лучше использовать его вместо этого.

Я смотрю на поисковую систему для индексации этой базы данных, так как Sphinx выглядит довольно привлекательно из-за ее конструкции, связанной с индексацией реляционных баз данных. Тем не менее, просмотр различных руководств и документации, кажется, показывает, что проекты баз данных зависят от поля auto_increment в той или иной форме и довольно жирного выражения в документации, в котором говорится, что идентификаторы документов должны быть только 32/64-битными целыми числами или вещи ломаются.

Есть ли способ индексировать базу данных Sphinx без полей auto_increment в качестве идентификатора?

Ответы [ 4 ]

17 голосов
/ 30 октября 2009

Конечно - это легко обойти. Если вам нужно создать свои собственные идентификаторы только для Sphinx, и вы не хотите, чтобы они конфликтовали, вы можете сделать что-то подобное в вашем sphinx.conf (пример кода для MySQL)

source products {

  # Use a variable to store a throwaway ID value
  sql_query_pre = SELECT @id := 0 

  # Keep incrementing the throwaway ID.
  # "code" is present twice because Sphinx does not full-text index attributes
  sql_query = SELECT @id := @id + 1, code AS code_attr, code, description FROM products

  # Return the code so that your app will know which records were matched
  # this will only work in Sphinx 0.9.10 and higher!
  sql_attr_string = code_attr  
}

Единственная проблема заключается в том, что вам все еще нужен способ узнать, какие записи были сопоставлены с вашим поиском. Sphinx вернет идентификатор (который теперь не имеет смысла) плюс любые столбцы, которые вы пометили как «атрибуты».

Sphinx 0.9.10 и выше сможет вернуть вам код вашего продукта как часть результатов поиска, поскольку он поддерживает строковые атрибуты.

0.9.10 пока не является официальным релизом, но выглядит великолепно. Похоже, Zawodny запускает его в списке Крейга , поэтому я бы не стал слишком нервничать, полагаясь на эту функцию.

3 голосов
/ 29 октября 2009

sphinx только требует, чтобы идентификаторы были целочисленными и уникальными, не имеет значения, автоматически они увеличиваются или нет, поэтому вы можете развернуть свою собственную логику. Например, генерируйте целочисленные хэши для ваших строковых ключей.

1 голос
/ 14 мая 2010

Я думаю, что возможно создать поток XML из ваших данных. Затем создайте идентификатор с помощью программного обеспечения (Ruby, Java, PHP).

Посмотрите на http://github.com/burke/mongosphinx

1 голос
/ 29 октября 2009

Sphinx не зависит от автоинкремента, просто нужны уникальные целочисленные идентификаторы документов. Возможно, вы можете иметь суррогатный уникальный целочисленный идентификатор в таблицах для работы со сфинксом. Как известно, целочисленный поиск выполняется намного быстрее, чем буквенно-цифровой поиск. Кстати, как долго ваш буквенно-цифровой код продукта? какие образцы?

...