Индексированная функциональность поиска - PullRequest
1 голос
/ 12 августа 2011

Я бы хотел добавить функциональность исследования в разрабатываемое мной программное обеспечение. Идея состоит в том, чтобы добавить какое-то «индексируемое» исследование, поэтому, когда пользователь вводит в текстовое поле другое, графический компонент показывает отфильтрованные результаты. Пример:

User types: a
aaa
aba
aab

user types: aa
aa
aab

и так далее. Конечно, у этой вещи есть имя (так как оно используется почти везде), но я не знаю его, и поэтому до сих пор я не мог найти ничего полезного в Интернете. Мне не нужен точный код, просто ссылка на некоторые ресурсы (учебник и т. Д.). Ty.

РЕДАКТИРОВАТЬ: Я не ищу функции автозаполнения: если я наберу текстовое поле, я хотел бы видеть все отфильтрованные результаты в (например) списке рядом с текстовым полем.

Ответы [ 2 ]

5 голосов
/ 13 августа 2011

То, что вы пытаетесь сделать, известно как автозаполнение (или это вариант, вы просто фильтруете список на лету), и это очень распространенная функция.

Требуется, чтобы вы могли быстро просматривать свои данные, поскольку вы должны иметь возможность обновлять список по мере формирования ввода.Конечно, ввод может быть в виде нажатия клавиш, и некоторые люди очень быстро набирают текст.

Если ваш список содержится в оперативной памяти и довольно мал, тогда вам лучше всего отфильтровать списокдля критериев поиска (я буду ссылаться на то, что набрано в этом поле)Как правило, базы данных НЕ подходят для такого рода вещей.В некоторых есть текстовое индексирование (в SQL Server), и если это соответствует вашим потребностям, вы делаете запрос на это.

Если вы не используете базу данных, то вы можете рассмотреть возможность использования Lucene.NET для индексирования вашего контента.Если ваш контент достаточно мал, я бы порекомендовал использовать RAMDirectory, в противном случае стандартный FSDirectory (на основе файлов) подойдет.

В Lucene вы захотите использовать пакет Contrib.Shingles (он может быть включен в последнюю сборку, я не уверен);это n-граммовый фильтр, который разбивает элементы по символам, поэтому в основном вы можете искать по первым нескольким символам (критериям поиска) и получать результаты.

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

Как правило, вы можете захотеть начатьпоиск по критериям поиска выходит за рамки двух символов.Кроме того, следите за количеством запросов, которые были сделаны;если у вас есть запрос, который возвращается, и новый вход был отправлен, отмените старый запрос и отправьте новый запрос, значения из старого запроса не будут использоваться.

Когда дело доходит до пользовательского интерфейсакомпонент, лучше позволить другому поставщику компонентов справиться с этим;WinForms имеет механизм автозаполнения для TextBox, Silverlight имеет автозаполнение в Silverlight Toolkit, jQuery имеет механизм автозаполнения для веб-страниц.Используйте один из них и перетасуйте свои данные под свой контроль, используя приведенные выше рекомендации.

0 голосов
/ 13 августа 2011

Если вы говорите о WinForms TextBox, то вы можете взглянуть на свойства AutomCompleteMode и AutoCompleteCustomSource TextBox.

...