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