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

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

  1. яблоки морковь
  2. яблоки
  3. морковь
  4. яблочный банан

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

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

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

2 ответа

Решение

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

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

Поэтому, если в вашем индексе Lucene есть поле "tag", ваш запрос будет

tag:apple* OR tag: carrot*

Что дало бы равное ранжирование каждому слову и большее значение ранга для документа с обоими тегами

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

tag:carrot* NOT tag:apple*

Простой пример, чтобы показать индексацию и запросы с Lucene здесь

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

  • Документ - это единица хранения в Lucene. Это несколько аналогично записи в базе данных.
  • Поле - поисковая единица в Lucene. Аналог столбца базы данных. Lucene ищет текст, беря запрос и сопоставляя его с полями. Поле должно быть проиндексировано, чтобы включить поиск.
  • Токен - поисковый атом в 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

См. Синтаксис синтаксического анализатора запросов Lucene для получения подробной информации о построении s.

Другие вопросы по тегам