我如何实现标签搜索?与lucene?

时间:2010-03-13 10:34:38

标签: c# .net lucene lucene.net tagging

我没有使用过lucene。上次我问(几个月前,也许一年)人们建议lucene。如果我不应该使用lucene我应该使用什么?例如,有些标记为

的项目
  1. 苹果胡萝卜
  2. 苹果
  3. 胡萝卜
  4. apple banana
  5. 如果用户搜索苹果我不在乎是否有来自1,2和4的任何偏好。但是我看到很多论坛这样做我讨厌当用户搜索苹果胡萝卜2和3有高结果而1很难即使它与我的搜索更紧密地匹配也能找到。

    此外,我希望有能力搜索胡萝卜 - 苹果只会让我3.我不知道如果我搜索胡萝卜香蕉会发生什么,但无论如何只要更多的项目标记为2和3的结果是较低的排名然后1,当我搜索苹果胡萝卜时,我会很高兴。

    lucene可以这样做吗?我从哪里开始?我试着查找它,当我看到很多课程时,我会看到有关文档,网页的教程,但是当我喜欢标记某些内容时,没有人明白该做什么。如果不是lucene我应该用什么标记?

2 个答案:

答案 0 :(得分:17)

编辑: 你可以使用Lucene。以下是Lucene.net中如何做到这一点的解释。 Lucene的一些基础知识是:

  • 文档 - 是Lucene的存储单元。它有点类似于数据库记录。
  • Field - Lucene的搜索单位。类似于数据库列。 Lucene通过查询并将其与字段匹配来搜索文本。应该对字段编制索引以启用搜索。
  • Token - Lucene中的搜索原子。通常是一个单词,有时是短语,字母或数字。
  • 分析器 - Lucene将字段转换为标记的部分。

请阅读this blog post有关创建和使用Lucene.net索引的信息。

我假设您正在标记博客帖子。如果我完全错了,请说出来。 为了搜索标签,您需要将它们表示为Lucene实体,即“标签”字段中的标记。

这样做的一种方法是为每个博客帖子分配一个Lucene文档。 该文件至少包含以下字段:

  • id:博客文章的唯一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 Query Parser Syntax

答案 1 :(得分:14)

Lucene for .net似乎已经成熟了。无需使用Java或SOLR

Standard query language for Lucene允许同等排名的搜索字词和否定

因此,如果您的Lucene索引有一个字段“tag”,那么您的查询将是

tag:apple* OR tag: carrot*

对于每个单词,这将给予相同的排名,并且使用两个标记对文档进行更多等级加权

要取消标记,请使用此

tag:carrot* NOT tag:apple*

使用Lucene here

显示索引和查询的简单示例