Вопросы | sqlite

Полнотекстовый поиск на мобильном устройстве?

Вопрос

Mat Nadrofsky | 958 просмотров | рейтинг: 5

Скоро мы приступим к разработке нового мобильного приложения. Это конкретное приложение будет использоваться для интенсивного поиска текстовых полей. Какие-либо предложения от группы в целом, какой механизм базы данных лучше всего подходит для таких поисков на мобильной платформе? В частности, Windows Mobile 6, и мы будем использовать .Net CF. Кроме того, некоторые текстовые поля могут содержать от 35 до 500 символов. Устройство будет работать двумя разными способами: пакетным и WiFi. Конечно, для Wi-Fi мы можем просто отправлять запросы в полноценный движок БД и просто возвращать результаты. Этот вопрос сосредотачивается вокруг пакетной версии, в которой будет размещена база данных, загруженная информацией о флэш-накопителе / съемной карте памяти устройства. В любом случае, я знаю, что в SQLCE есть некоторая базовая индексация, но вы не попадете в настоящие причудливые полнотекстовые индексы, пока не получите полноценную версию, которая, конечно, недоступна на мобильной платформе. Пример того, как будут выглядеть данные: фартук плотник регулируемый кожаный контейнер карман талии аппаратный ремень и т. д. и т. д. Я еще не принимал участие в оценке каких-либо других конкретных вариантов, так как я решил использовать опыт этой группы, чтобы сначала указать мне некоторые конкретные возможности. Любые предложения / советы?

Комментарии:

Mat Nadrofsky

Все еще ищу ответы на этот вопрос.




Ответы

Jason Down

+ 2 -
Вы можете попробовать Lucene.Net. Я не уверен, насколько хорошо он подходит для мобильных устройств, но он позиционируется как высокопроизводительная, полнофункциональная библиотека для поиска текста. http://incubator.apache.org/lucene.net/ http://lucene.apache.org/java/docs/


Jason Down

+ 2 -
Совсем недавно у меня была такая же проблема. Вот что я сделал: Я создал класс для хранения только идентификатора и текста для каждого объекта (в моем случае я назвал его sku (номер элемента) и описание). Это создает меньший объект, который использует меньше памяти, так как он используется только для поиска. Я все равно получу полноценные объекты из базы данных после того, как найду совпадения.
 public class SmallItem
{
    private int _sku;
    public int Sku
    {
        get { return _sku; }
        set { _sku = value; }
    }

    // Size of max description size + 1 for null terminator.
    private char[] _description = new char[36];
    public char[] Description
    {
        get { return _description; }
        set { _description = value; }
    }

    public SmallItem()
    {
    }
}
 

После создания этого класса вы можете создать массив (на самом деле я использовал List) этих объектов и использовать его для поиска в вашем приложении. Инициализация этого списка занимает немного времени, но вам нужно только позаботиться об этом при запуске. По сути, просто запустите запрос к вашей базе данных и получите данные, необходимые для создания этого списка. Как только у вас есть список, вы можете быстро просмотреть его в поисках любых слов, которые вы хотите. Поскольку это контейнер, он также должен находить слова в словах (например, упражнение будет возвращать упражнение, сверло, сверла и т. Д.). Для этого мы написали доморощенную неуправляемую функцию на языке c #. Он принимает массив строк слов (так что вы можете искать более одного слова ... мы используем его для поиска AND ... описание должно содержать все слова, переданные в ... ИЛИ в настоящее время не поддерживается в этом примере) , Когда он просматривает список слов, он формирует список идентификаторов, которые затем передаются обратно вызывающей функции. Получив список идентификаторов, вы можете легко выполнить быстрый запрос в своей базе данных, чтобы получить полноценные объекты на основе быстро индексируемого идентификационного номера. Следует отметить, что мы также ограничиваем максимальное количество возвращаемых результатов. Это может быть удалено. Это просто удобно, если кто-то вводит что-то вроде e в качестве поискового запроса. Это даст много результатов. Вот пример пользовательской функции Contains:
 public static int [] Contains (string [] descriptionTerms, int maxResults, List itemList)
{
    // Не допускаем превышения максимально допустимого результата.
    int [] matchSkus = new int [maxResults];

    // Индексы и счетчики.
    int matchNumber = 0;
    int currentWord = 0;
    int totalWords = descriptionTerms.Count () - 1; // - 1, потому что он будет использоваться с 0 индексами массива

    bool matchedWord;

    пытаться
    {
        / * Массив символьных массивов. Каждый массив - это слово, которое мы хотим сопоставить.
         * Нам нужно + 1, потому что у totalWords - 1 (здесь мы задаем размер / длину,
         * поэтому он не основан на 0 ... мы использовали - 1 на totalWords, потому что он используется для 0
         * на основе индексации ссылок.)
         * * /
        char [] [] allWordsToMatch = новый символ [totalWords + 1] [];

        // Массив символов для хранения текущего слова для сопоставления.
        char [] wordToMatch = new char [36]; // Максимально допустимый размер слова + нулевой терминатор ... Я просто выбрал 36, чтобы соответствовать максимальному размеру описания.

        // Перебираем исходный строковый массив или слова для сопоставления и создаем символьные массивы.
        для (currentWord = 0; currentWord



Теги

sqlite | search | windows-mobile | full-text-search | sql-server-ce