V
V
Vitaly2016-11-06 02:12:52
.NET
Vitaly, 2016-11-06 02:12:52

How to properly configure SQLite for C#?

Здравствуйте, как в SQLite можно организовать регистронезависимый поиск? Нужно настроить неполнотекстовый поиск, чтобы можно было искать по части слова. Сейчас программа построена на System.Data.SQLite.dll использую оператор Like и переопределенный оператор Lower(), т.к. стандартная функция не умеет работать с русскими символами, получился запрос select * from myTable where Lower(myColumn) Like '%текст%'. Все замечательно работает, но при этом поиск выполняется очень долго и по базе размером в ~ 20-50 тыс. строк поиск может выполняться секунд 5. Наткнулся на статьи в которых пишется про ICU, что длянормального поиска по русским символам нужно использовать библиотеку SQLite со встроенной ICU. На официальном сайте нашел библиотеку Sqlite3.dll но по умолчанию она тоже не поддерживает русский. Нашел кучу библиотек SQLite3.dll с поддержкой русских символов со встроенной ICU, но ни одну не получилось подключить, при попытке обращения к ней приложение виснет. Подскажите как еще можно настроить регистронезависимый поиск на SQLite чтобы сократить время запроса? Или может кто-нибудь поделится собранной рабочей библиотекой с поддержкой ICU?
Язык программирования C#, максимально возможный framework 4.0

Answer the question

In order to leave comments, you need to log in

1 answer(s)
Артем Дудник, 2016-11-10
@schart

Я бы посоветовал Вам для полнотекстового поиска сделать некий аналог обратного индекса в базе .
Грубо говоря у вас есть несколько таблиц
1. Таблица Words (id, text)
2. Таблица Documents (id, <какие-то поля для ссылок>)
3. Таблица WordInDocument (wordId, documentId)
Т.е. Вы берете некий текст, по которому надо искать, бьете его на слова, приводите их к регистру одному и вставляете в таблицу слова в таблицу Words, Id документа с текстом в таблицу Documents, и пары в таблицу WordInDocument
Допустим вы ищете слово "хабр" примерный запрос

SELECT wd.documentId FROM Words as w
INNER JOIN WordInDocuments as wd ON w.Id = wd.wordId
WHERE w = 'хабр'

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question