我想将2个不同的实体(在本例中为SQL中的2个表)索引到我的Lucene索引中。一个表包含产品,另一个表包含新闻项目。
为了能够使用相同的搜索方法(查询)来搜索产品和新闻项目,我知道它们必须在同一个索引中,因此Solr的几个核心设置不起作用 - 对吗?
在data-config.xml中,我已经定义了2个具有相应实体的文档类型。
在schema.xml中,我也为产品和新闻项定义了字段。 在我的数据库设计(表格)中,我的产品表的唯一键称为“ProductID”,其中我的新闻项的唯一键称为“Id”(这是由我正在使用的CMS制作的)。
在data-config.xml中,我应该将我的唯一ID映射到相同的“名称”。是否可以完成这项工作?
我是否遵循了正确的方法?
我正在思考的例子;
数据-config.xml中
<!-- Products -->
<document name="products">
<entity name="product" dataSource="sqlServer" pk="ProductID" query="SELECT
ProductID,
ProductNumber,
ProductName,
FROM EcomProducts">
<field column="ProductID" name="**Id**"/>
<field column="ProductNumber" name="ProductNumber"/>
<field column="ProductName" name="ProductName"/>
</entity>
</document>
<!-- News items --->
<document name="newsitems">
<entity name="newsitems" dataSource="sqlServer" pk="id" query="SELECT
Id,
NewsItemTitle,
NewsItemContent,
FROM ItemType_NewsItems">
<field column="Id" name="**Id**"/>
<field column="NewsItemTitle" name="NewsItemTitle"/>
<field column="NewsItemContent" name="NewsItemContent"/>
</entity>
</document>
schema.xml中
<!-- Products --->
<field name="**Id**" type="text_general" indexed="true" stored="true" required="true" />
<field name="ProductNumber" type="text_general" indexed="true" stored="true" required="false" />
<field name="ProductName" type="text_general" indexed="true" stored="true" required="false" multiValued="false"/>
<!-- Tips og fif --->
<field name="**Id**" type="text_general" indexed="true" stored="true" required="true" />
<field name="NewsItemTitle" type="text_general" indexed="true" stored="true" required="false" />
<field name="NewsItemContent" type="text_general" indexed="true" stored="true" required="false" />
编号
答案 0 :(得分:0)
如果要一起搜索它们,我会将元数据映射到公共模式。也许ProductName和NewItemTitle都会进入“标题”字段。某些元数据对每种类型都是唯一的。或者您可以将信息索引两次,一次作为ProductName,一次作为标题。
除非您可以确定ID始终在两个来源中始终是唯一的,否则您可能需要为它们添加前缀。拥有一个标记每个文档类型的字段也非常方便。这样只允许搜索一种类型,在DIH中,您可以使用它只删除一种类型。
在SQL中,您可以添加如下列:
concat('product-',cast(ProductId as char)) as id,
'product' as type,
这是MySQL语法,可能需要调整SQLServer。