Как реализовать поиск тегов? с люцином?

Я не использовал луцен. В прошлый раз, когда я спрашивал (много месяцев назад, может быть, год), люди предлагали люцен. Если я не должен использовать lucene, то что я должен использовать? Например, например, есть теги, помеченные как

  • яблоки морковь
  • яблоки
  • морковь
  • яблочный банан

если пользовательские ящики поиска не заботятся, если есть предпочтения от 1,2 и 4. Однако я видел, что многие форумы делают это, что я ненавидел, когда пользовательский поиск яблочных морков 2 и 3 имеет высокие результаты, а 1 - найти, даже если он ближе соответствует моему поиску.

Также мне хотелось бы сделать поиск моркови-палочки, которые доставят мне только 3. Я не уверен, что должно произойти, если я буду искать морковь банана, но в любом случае, если больше предметов, помеченных результатами 2 и 3, то 1, когда я ищу яблоки морковь, я буду счастлив.

Может ли lucene это сделать? и с чего начать? Я пробовал искать его, и когда я вижу много классов, и я увижу, как учебники рассказывают о документах, веб-страницах, но никто не понимал, что делать, когда мне нравится что-то отмечать. Если не lucene, то что я должен использовать для пометки?

Ответ 1

Lucene для .net кажется зрелым. Не нужно использовать Java или SOLR

Стандартный язык запросов для Lucene позволяет использовать равнозначные поисковые термины и отрицание

Итак, если ваш индекс Lucene имеет поле "тег", ваш запрос будет

tag:apple* OR tag: carrot*

Который дал бы равное ранжирование каждому слову, и более раннее взвешивание документа с обоими тегами

Чтобы скрыть тег, используйте этот

tag:carrot* NOT tag:apple*

Простой пример для индексирования и запросов с помощью Lucene здесь

Ответ 2

Изменить: Вы можете использовать Lucene. Вот объяснение, как это сделать в Lucene.net. Некоторые основы Lucene:

  • Документ - это единица хранения в Lucene. Это несколько похоже на запись базы данных.
  • Поле - поисковый блок в Люцене. Аналогично столбцу базы данных. Lucene ищет текст, беря запрос и сопоставляя его с полями. Для включения поиска необходимо проиндексировать поле.
  • Token - поисковый атом в Lucene. Обычно слово, иногда фраза, буква или цифра.
  • Анализатор - часть Lucene, которая преобразует поле в токены.

Прочитайте это сообщение в блоге о создании и использовании индекса Lucene.net.

Я предполагаю, что вы помещаете сообщения в блоге. Если я ошибаюсь, скажите об этом. Чтобы искать теги, вы должны представлять их как объекты Lucene, а именно как маркеры внутри поля "теги".

Один из способов сделать это - назначить документ Lucene для одного сообщения в блоге. Документ будет иметь по крайней мере следующие поля:

  • id: уникальный идентификатор сообщения в блоге.
  • содержание: текст сообщения в блоге.
  • теги: список тегов.

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

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

Подробнее о построении s см. Синтаксис парсера запросов Lucene.