Использовать хиты Lucene для фильтрации привязки DataSet к ListView в WPF C #? - PullRequest
0 голосов
/ 21 июня 2010

Хорошо, поэтому у меня есть ListView с множеством доступных ему элементов в любое время (в виртуализированном режиме).Прямо над ListView находится текстовое поле, в котором пользователь может ввести любой критерий поиска, и ListView будет отфильтрован в реальном времени.ListView в настоящее время привязан к DataSet следующим образом:

SoundListView.DataContext = DS.Tables[0].DefaultView;

DataSet извлекается из внутренней базы данных SQLite.

А вот текущий код фильтра, который принимает текст поля поискачтобы отфильтровать ListView:

DS.Tables[0].DefaultView.RowFilter = String.Format("path LIKE '%{0}%'", EscapeLikeValue(SearchTextBox.Text));

Здесь вы можете видеть, что я использую дрянной модификатор LIKE SQL для фильтрации своих элементов на основе ключевого термина.Это плохо, потому что LIKE не является заменой полнотекстового поиска IMO.Чтобы решить эту проблему, я реализовал Lucence.NET.

Используя Lucene, я беру поисковый термин из текстового поля, и он выполняет поиск в Google-esque, где я могу использовать логические операторы и делать нечеткиесоответствующие и классные вещи, как это.Этот поиск в настоящее время работает!Поиск Lucene возвращает список идентификаторов, которые соответствуют идентификаторам в наборе данных, которые подают в ListView.

Итак, последняя часть моей головоломки состоит в том, чтобы заставить эти запросы поиска Lucene фильтровать ListView.Должен ли я использовать RowFilter и объединить все идентификаторы, которые совпадают в какой-то ужасной строке SQL, такой как:

... RowFilter = "id = 1 OR id = 3 OR id = 7"

Или есть лучший способ сделать это?

1 Ответ

0 голосов
/ 21 июня 2010

Вы должны использовать CollectionViewSource, и это Filter событие для фильтрации данных в коллекции. Используйте метод CollectionViewSource.GetDefaultView(), чтобы получить представление по умолчанию.


Вот ссылка на образец сортировки и фильтрации: http://go.microsoft.com/fwlink/?LinkID=160040 с этой страницы .

...