Edit:
Вы можете использовать Lucene. Вот объяснение, как это сделать в Lucene.net.
Некоторые основы Lucene:
- Документ - это единица хранения в Lucene. Это несколько аналогично записи в базе данных.
- Поле - поисковая единица в Lucene. Аналог столбца базы данных. Lucene ищет текст, принимая запрос и сопоставляя его с полями. Поле должно быть проиндексировано, чтобы включить поиск.
- Token - поисковый атом в Lucene. Обычно слово, иногда фраза, буква или цифра.
- Анализатор - часть Lucene, которая преобразует поле в токены.
Прочтите это сообщение в блоге о создании и использовании индекса Lucene.net.
Я полагаю, вы отмечаете сообщения в блоге. Если я совершенно не прав, скажите, пожалуйста.
Для поиска тегов вам необходимо представить их как объекты Lucene, а именно как токены внутри поля «тегов».
Один из способов сделать это - назначить документ Lucene для каждого сообщения в блоге.
Документ будет содержать как минимум следующие поля:
- id: уникальный идентификатор сообщения в блоге.
- content: текст поста в блоге.
- тегов: список тегов.
Индексация: всякий раз, когда вы добавляете тег в сообщение, удаляете тег или редактируете его, вам нужно будет проиндексировать сообщение. Анализатор преобразует поля в их представление токенов.
Document doc = new Document();
doc.Add(new Field("id", i.ToString(), Field.Store.YES, Field.Index.NO));
doc.Add(new Field("content", text, Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("tags", tags, Field.Store.YES, Field.Index.TOKENIZED));
writer.AddDocument(doc);
Оставшаяся часть является поисковой. Для этого вам нужно создать QueryParser и передать ему строку запроса, например:
QueryParser qp = new QueryParser();
Query q = qp.Parse(s);
Hits = Searcher.Search(q);
Синтаксис, который вам нужен для s будет:
tags: apples tags: carrots
Для поиска яблок или моркови
tags: carrots NOT tags: apples
См. синтаксический анализатор запросов Lucene для получения подробной информации о построении s.