使用Lucene.NET为每本书索引多个作者

时间:2017-08-23 09:51:39

标签: c# search indexing lucene lucene.net

我使用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%"

按作者搜索:

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

  

SELECT * FROM books WHERE title LIKE"%skating%"和作者CONTAIN" Jack Black"

那我该怎么做呢?我每本书都有作者姓名和作者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搜索来查找与作者的所有书籍&#34; 125&#34; ...这会起作用还是会列出作者的书籍&#34; 1254&#34;?< / p>

1 个答案:

答案 0 :(得分:0)

感谢Lucas,我​​想你可以在索引编制过程中多次添加相同的字段:

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

这允许您使用高性能的TermsFilter来搜索完全匹配。