使用具有一对多关系的表/实体创建Lucene.net文档索引

时间:2012-12-03 13:23:17

标签: c# lucene full-text-search lucene.net

我正在尝试Lucene.net应用全文搜索,并能够在此链接的帮助下使用它 http://www.codeproject.com/Articles/320219/Lucene-Net-ultra-fast-search-for-MVC-or-WebForms

但它只有一些简单数据的例子

当我有一个场景,其中两个实体与一对多关系链接。

class Product
{
  public int Id{get;set;}
  public int Name{get;set;}
}

class Shop
{
  public int Id{get;set;}
  public int Name{get;set;}
  public List<Product> Products{get;set;}
}

现在实现/(将其作为单个表或doc存储在索引中)这有点棘手。

我应该为索引创建两个文档吗?

但是如果在Product进行搜索并且只返回Product而不是商店的结果,则链接会出现问题。

它的出路是什么?或其他一些方式?

- EDIT ---

需要将这些1:N相关数据存储在单个文档中,因为我将在两个实体的任何字段上进行搜索。

因此,即使在lucene返回结果之后,它也可以为两个实体提供id。

1 个答案:

答案 0 :(得分:2)

一种选择是在索引中为每个产品文档创建一个字段,该字段包含所有商店ID。

文件(产品)

Name             | Shop
------------------------
Super Product XY | 1 5 7

现在,如果你只想在一家商店中搜索,你可以做这样的事情。

+Name:"Super Product" +Shop:5

一般来说,这完全取决于您的要求。您是否需要搜索所有商店并找出,哪家商店提供产品,或者您想将搜索限制在单个或多个商店。

===更新===

如果您想要收到Product-ID和Shop-ID,您可以将Fields ProductID和ShopID定义为“Field :: STORE_YES”(C ++ Variant,我不知道.NET定义)。

(STORE_YES)|(INDEXED_TOKENIZED)| (STORE_YES)
ProductID  | Name              | ShopID
--------------------------------------
1          | Super Product XY  | 1 5 7
2          | Not good Product  | 2 5 6
--------------------------------------

从找到的Document对象中,您可以阅读 ProductID ShopID 字段,它们可以满足您的所有需求。 ShopID 将以字符串形式返回,您可以按空格(“”)拆分,并且您有一个ShopID数组。