【问题标题】:Index multiple authors per book using Lucene.NET使用 Lucene.NET 为每本书索引多个作者
【发布时间】:2017-08-23 09:51:38
【问题描述】:

我正在使用 Lucene.NET 构建一个包含 1000 万多本书的搜索索引。我正在用它来索引一本书:

Document doc = new Document();

doc.Add(new Field("id", bookID, Field.Store.YES, Field.Index.NO));

doc.Add(new Field("publisher", publisherName, Field.Store.YES, Field.Index.NOT_ANALYZED));

doc.Add(new Field("title", bookTitle, Field.Store.YES, Field.Index.ANALYZED));

按出版商搜索:

由于我已使用 Index.NOT_ANALYZED 为图书出版商编制索引,因此我可以使用高性能的 TermsFilter 执行以下操作:

SELECT * FROM books WHERE publisher="O'Reilly Media"

按标题搜索:

当然,由于我已经使用 Index.ANALYZED 选项为书名编制索引,因此我可以使用标准 QueryParser 来执行以下操作:

SELECT * FROM books WHERE title LIKE "%skating%"

按作者搜索:

但是现在我需要按作者搜索。我需要类似的东西:

从书名如“%skating%”且作者包含“杰克·布莱克”的书籍中选择 *

那我该怎么做呢?我在每本书中都存储了作者姓名和作者 ID。如何将其索引到 Lucene 文档中,然后按作者快速搜索所有书籍?我不想使用 SQL,因为我需要将搜索关键字与作者过滤器结合起来,所以 Lucene 必须为我做作者过滤。

最明显的解决办法是:

doc.Add(new Field("authors", "Jack Black; Joan White", Field.Store.YES, Field.Index.ANALYZED));

但这会错误地返回一位作者的名字相似/在另一位作者的名字内的书籍,例如:

  • 第 1 册:作者:Jack D Black、Bob A Smith
  • 第二册:作者:D Black

所以此时搜索“D Black”会错误地返回书 1 和书 2,而不仅仅是书 2。因此我需要索引整个作者姓名或 ID(使用 Index.NOT_ANALYZED),但我需要多个每本书的此类字段。这可能吗?

// can I add the same field multiple times into a document?
doc.Add(new Field("author", "Jack D Black", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("author", "Bob A Smith", Field.Store.YES, Field.Index.NOT_ANALYZED));

或者我可以添加作者 ID,以便分析器将每个数字作为一个独立的单词:

doc.Add(new Field("authors", "125;1885;23", Field.Store.YES, Field.Index.ANALYZED));

然后使用常规的 Lucene 搜索来查找作者为“125”的所有书籍...这是否可行,或者这是否也会列出作者为“1254”的书籍?

【问题讨论】:

  • 那你为什么不直接添加一个author 字段然后查询呢?
  • @LucasTrzesniewski - 问题已编辑以反映...
  • 哦,我明白了。是的,您可以多次添加同一个字段,Lucene 将为每个值编制索引(我想 Lucene.Net 也是如此)。

标签: c# search indexing lucene lucene.net


【解决方案1】:

感谢 Lucas,我​​发现您可以在索引期间多次添加相同的字段:

foreach (string author in authors){
   doc.Add(new Field("author", author, Field.Store.YES, Field.Index.NOT_ANALYZED));
}

这允许您使用高性能的术语过滤器来搜索精确匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多