Сфинкс без использования идентификатора auto_increment

StackOverflow https://stackoverflow.com/questions/1644800

  •  10-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

Конечно, это легко обойти. Если вам нужно создать свои собственные идентификаторы только для 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 запускает его в списке Крейга , поэтому я бы не стал слишком нервничаю, полагаясь на эту функцию.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top