Здравствуйте, Keith, Вы писали:
K>В таблице примерно 1 млн строк типа nvarchar(410).
K>
K> select *
K> from Person
K> where Address like '%мойзапрос%'
K>
Полнотекстовый индекс тебе поможет, его объем раза в три превысит суммарный объем всех строк в поле адрес.
Без него единственно что можно сделать — вынести поле адрес в отдельную таблицу
(можно заполнять отдельную таблицу в триггере, а в персон адрес оставить)
Если есть особенности поиска, часть информации можно просто выкидывать (например ул, пер, проспект и т.д.),
в идеале при приведении к "нормальному" виду запрос можно будет перевести из like '%мойзапрос%' к like 'мойзапрос%'
возможно по одной персоне хранить несколько строчек из таблицы адрес
тогда твой запрос будет выглядеть следующим образом:
select *
from Person
JOIN Address ON Address.Id=Person.Id
WHERE Address.Address like '%мойзапрос%' -- в идеале like 'мойзапрос%'
Здравствуйте, Didi, Вы писали:
D>возможно по одной персоне хранить несколько строчек из таблицы адрес D>тогда твой запрос будет выглядеть следующим образом: D>
D> select *
D> from Person
D> JOIN Address ON Address.Id=Person.Id
D> WHERE Address.Address like '%мойзапрос%' -- в идеале like 'мойзапрос%'
D>
D>Ну или IN() при связи один ко многим
Т.е. если выносить строку в отдельную таблицу, то нужно делать дополнительное поле Id и по нему как раз и join'ить?
Спасибо, попробую.
Здравствуйте, Didi, Вы писали:
D>Без него единственно что можно сделать — вынести поле адрес в отдельную таблицу
Я правильно понимаю, что само по себе вынесение в отдельную таблицу столбца по которому идет поиск должно дать какое-то преимущество? Я только что оставил в таблице только два столбца — id и address и попробовал поискать — получилось то же время, что и без вынесения. Что я делаю не правильно?
K> Я правильно понимаю, что само по себе вынесение в отдельную таблицу столбца по которому идет поиск должно дать какое-то преимущество? Я только что оставил в таблице только два столбца — id и address и попробовал поискать — получилось то же время, что и без вынесения. Что я делаю не правильно?
Все ты сделал правильно (надеюсь по id основной таблицы индекс есть), просто было сказано, что строк в "персон" достаточно много и возможно она не помещалась полностью в оперативную память, тогда более узкая таблица в память влезет обязательно — если нет разницы, значит они обе полностью помещаются в оперативке, при этом разницы практически нет.
У тебя два выхода, изменить хранение в вспомогательной таблицы адреса, так, чтобы можно было искать по like 'мой запрос%' (и создать индекс по этому полю), я не знаю что у тебя там хранится, обычно операторы вносят "ул. Красноармейская", а найти хотят все по Красноар% — соответственно тебе нужно очищать при сохранении строки от всякого мусора (первозданная строка у тебя сохранена в таблице "персон")
Второй вариант использовать полнотекстовый поиск, правда он не совсем соответствует like'%мой_запрос%' а скорее like'% мой_запрос%' т.е. ищет только с начала слова. Поэтому при поиске "армейск%" улица Красноармейская найдена не будет.
Здравствуйте, Didi, Вы писали:
D>У тебя два выхода, изменить хранение в вспомогательной таблицы адреса, так, чтобы можно было искать по like 'мой запрос%' (и создать индекс по этому полю), я не знаю что у тебя там хранится, обычно операторы вносят "ул. Красноармейская", а найти хотят все по Красноар% — соответственно тебе нужно очищать при сохранении строки от всякого мусора (первозданная строка у тебя сохранена в таблице "персон")
К сожалению, изменить все существующие адреса нет возможности и пользователи хотят искать по любому фрагменту, поэтому 'мой_запрос%' не подходит.
D>Второй вариант использовать полнотекстовый поиск, правда он не совсем соответствует like'%мой_запрос%' а скорее like'% мой_запрос%' т.е. ищет только с начала слова. Поэтому при поиске "армейск%" улица Красноармейская найдена не будет.
Здравствуйте, Keith, Вы писали:
K> Как ускорить процесс? K> Поможет ли полнотекстовый индекс и какого объема он получится? K> (проект на хостинге — БД докупать не хочется)
Если полнотекстовый поиск не поможет, то можно посмотреть в сторону Lucene. Вот только прикрутить его будет много сложнее чем добавить полнотекстовый индекс.
Здравствуйте, Aikin, Вы писали:
A>Здравствуйте, Keith, Вы писали:
K>> Как ускорить процесс? K>> Поможет ли полнотекстовый индекс и какого объема он получится? K>> (проект на хостинге — БД докупать не хочется) A>Если полнотекстовый поиск не поможет, то можно посмотреть в сторону Lucene. Вот только прикрутить его будет много сложнее чем добавить полнотекстовый индекс.
а чем Lucene лучше полнотекстового поиска MSSQL ? A>СУВ, Aikin
Здравствуйте, cadet354, Вы писали:
A>>Если полнотекстовый поиск не поможет, то можно посмотреть в сторону Lucene. Вот только прикрутить его будет много сложнее чем добавить полнотекстовый индекс. C>а чем Lucene лучше полнотекстового поиска MSSQL ?
Я не знаю что из себя представляет полнотекстовый поиск в MSSQL, но, судя по сообщению
, может он не так уж и много. В отличии от того же Lucene.
Вполне возможно, что это сообщение скорее всего далеко от действительности (ну не может MS так лопухнуться ), но опровержения до сих пор не было
Здравствуйте, Aikin, Вы писали:
A>Здравствуйте, cadet354, Вы писали:
A>>>Если полнотекстовый поиск не поможет, то можно посмотреть в сторону Lucene. Вот только прикрутить его будет много сложнее чем добавить полнотекстовый индекс. C>>а чем Lucene лучше полнотекстового поиска MSSQL ? A>Я не знаю что из себя представляет полнотекстовый поиск в MSSQL, но, судя по сообщению
, может он не так уж и много. В отличии от того же Lucene. A>Вполне возможно, что это сообщение скорее всего далеко от действительности (ну не может MS так лопухнуться ), но опровержения до сих пор не было
со стёмингом в текущей версии действительно не фонтан, я например при тестировании наткнулся на то что словоформы от слова шторм не строяться. И свои не подложить
но в люске аналогичная проблема. A>
судя по этой ветке: вопрос про разные полнотекстовые движки
lucene не лучше, там даже синонимов нет (в MS есть) A>Я же просто указал альтернативу.
понятно, интересно мнение тех кто поробывал и то и другое с учетом поиска по русскому тексту. A>Кста, нашел статью про разные поиски: http://habrahabr.ru/blogs/webdev/30594/
A>СУВ, Aikin
, может он не так уж и много. В отличии от того же Lucene. A>Вполне возможно, что это сообщение скорее всего далеко от действительности (ну не может MS так лопухнуться ), но опровержения до сих пор не было
Я так понимаю, что это был кивок в мою сторону.
Давайте вместе почитаем короткое определение Полнотекстовый поиск
кто не любит читать, одно предложение: полнотекстовый индекс — словарь, в котором перечислены все слова
Т.е. по определению с середины слова полнотекстовый индекс искать не может (точнее может но это уже не индекс, потому как нужно делать полный перебор всех слов в словаре, а потом уже находить места где они встречались, думаю по скорости это не сильно отличается от перебора записей всей таблицы), да теоретически можно было бы построить словарь букв (или буквосочетаний), но на самом деле это никому не нужно, попробуйте использовать поисковики Google, Yandex и пр., вы находили когда-нибудь тексты с середины заданного слова?
др. словами несмотря на глубокие знания и законов Ома и Кирхгофа, как течет керосин по проводам к лампочке мы совсем не понимаем?