Поиск алфавитной позиции в большом списке - PullRequest
0 голосов
/ 07 марта 2009

У меня есть таблица as400, содержащая примерно 1 миллион строк полных имен / названий компаний, которые я хотел бы преобразовать, чтобы использовать другое хранилище данных, при этом сохраняя скорость оригинала.

В настоящее время пользователь входит в поиск и практически мгновенно получает алфавитную позицию поискового термина в таблице и на странице совпадений. Затем пользователь может очень быстро разбивать записи вверх или вниз по записям.

Данные почти не обновляются и примерно 50 вставок в неделю. Я думаю, что любая база данных может поддерживать алфавитный указатель имен, но я не уверен, как быстро найти позицию поиска в наборе данных. Любые предложения с благодарностью.

Ответы [ 3 ]

2 голосов
/ 07 марта 2009

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

Допустим, вы хотите получить 10 строк после этой позиции и 10 строк до нее.

Если пользователь ищет «Смит», вы можете сделать два выбора, например:

SELECT
  name
FROM
  companies
WHERE
  name < 'Smith'
ORDER BY
  name DESC
LIMIT 10

, а затем

SELECT
  name
FROM
  companies
WHERE
  name >= 'Smith'
ORDER BY
  name
LIMIT 10

Вы могли бы сделать UNION, чтобы получить это в одном запросе, вышеупомянутое просто упрощено.

Термин, который искал пользователь, соответствовал бы половине этих результатов. Если есть какие-либо точные совпадения, то первое точное совпадение будет расположено так, что оно будет одиннадцатым.

Обратите внимание, что если пользователь ищет «aaaaaaaa», то, вероятно, он просто получит 10 первых результатов, но перед ним ничего не будет, а для «zzzzzzzz» он может получить только 10 последних результатов.

Я предполагаю, что рассматриваемый механизм SQL позволяет> = и <сравнения между строками (и может оптимизировать это в индексах), но я не проверял это, может быть, вы не можете сделать это. Если, как и MySQL, он поддерживает интернационализированные параметры сортировки, то вы можете даже правильно упорядочить символы, не относящиеся к ascii. </em>

1 голос
/ 07 марта 2009

Просто добавить к заказу предложения:

  • Добавьте индекс к имени, если это ваше стандартное средство поиска данных.
  • Вы можете эффективно разбивать на страницы, комбинируя LIMIT и OFFSET .
1 голос
/ 07 марта 2009

Если под «позицией поиска» вы подразумеваете номер записи, если они были перечислены в алфавитном порядке, вы можете попробовать что-то вроде:

select count(*) from companies where name < 'Smith'

Большинство баз данных должны достаточно хорошо оптимизировать это (но попробуйте - теории, которые вы читаете в Интернете, не имеют преимуществ перед эмпирическими данными).

...