15

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

  1. 苹果 胡萝卜
  2. 苹果
  3. 萝卜
  4. 苹果香蕉

如果用户搜索苹果,我不在乎 1,2 和 4 是否有任何偏好。但是我看到很多论坛都这样做,我讨厌的是,当用户搜索苹果胡萝卜 2 和 3 时结果很高,而 1 甚至很难找到虽然它更符合我的搜索。

我也希望能够搜索胡萝卜-苹果,这只会让我得到 3。我不确定如果我搜索胡萝卜香蕉会发生什么,但无论如何只要标记为 2 和 3 结果的更多项目的排名低于 1 时我搜索苹果胡萝卜我会很高兴。

lucene可以做到这一点吗?我从哪里开始?我尝试查找它,当我这样做时,我会看到很多课程,并且会看到有关文档,网页的教程,但是当我喜欢标记某些东西时,没有人清楚该做什么。如果不是 lucene,我应该用什么来标记?

4

2 回答 2

17

编辑:您可以使用 Lucene。以下是如何在 Lucene.net 中执行此操作的说明。一些 Lucene 基础知识是:

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

请阅读这篇关于创建和使用 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 查询解析器语法

于 2010-03-14T15:33:08.050 回答
16

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

Lucene的标准查询语言允许同等排名的搜索词和否定

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

tag:apple* OR tag: carrot*

这将为每个单词提供相同的排名,并为具有两个标签的文档提供更多的排名权重

要否定标签,请使用此

tag:carrot* NOT tag:apple*

在此处显示使用 Lucene 进行索引和查询的简单示例

于 2010-03-22T20:52:56.837 回答