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

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

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

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

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

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

Ответы [ 2 ]

17 голосов
/ 14 марта 2010

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.

14 голосов
/ 22 марта 2010

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

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

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

tag:apple* OR tag: carrot*

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

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

tag:carrot* NOT tag:apple*

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

...