用Solr 5.1.0处理MySQL的多个表



我的MySQL数据库中有30个以上的表。最近,我使用dataImporthandler和我的 data-config.xml 文件中的1个表到Solr 5.1.0的导入数据,

select * from table-name

但是,在我的搜索中,我必须集成10个以上的表才能给出适当的搜索结果。

这样做的方法是

1)使用在MySQL数据库中使用查询数据,然后导入

2)通过导入完整数据单独的表。

我做的是什么?哪种好方法?

  1. 通过在MySQL数据库中使用JOIN查询导入数据并导入

    是的,这在使用dih中可以实现。使用DIH,您必须配置数据config.xml。在这里,您可以使用JONINS编写查询从所有所需表中获取数据。在这里,您可以创建一个核心,并且可以将所有数据放在单个核心中。您可以使用这些字段创建文档。(文档字段将在schema.xml中提及)。

    在此处考虑以进行优化的要点是您要在结果中搜索并要显示的所有字段。因此,您需要首先进行此操作。您将在字段上进行搜索并需要显示。

    您需要搜索的字段将它们作为索引=" true"。休息全部作为索引=" false"。您在结果中需要的字段标记为存储=" true"。休息全部作为存储=" false"。

    有些可能两者都需要,例如搜索和显示结果。将它们标记为索引=" true",然后存储=" true"。

    例如,我的文档中有15个字段,但只有4个字段,因为我只想在这些字段上搜索。结果所有字段都显示在结果中,因此存储了。

    现在来到您的第二个问题

    通过导入完整数据单独的表来加入SOLR核心。是的,因为Solr 4.0

    在Solr中可能可以

    有关详细示例检查以下链接https://wiki.apache.org/solr/join

    但也限制它的局限性。

  2. 字段或正在加入的文档的其他属性不可用于处理结果集的"到"文档(即:您无法在"来自"文档中的字段中返回字段,就好像它们是"到"文档上的多价字段)。

    因此,您可以在打出最后的电话之前考虑这些要点。

在这里考虑您有两个核心

core brands with fields {id,name}
core products with fields{id, name, brand_id}
data in core BRANDS: {1, Apple}, {2, Samsung}, {3, HTC}
data in core PRODUCTS: {1, iPhone, 1}, {2, iPad, 1}, {3, Galaxy S3, 2}, {4, Galaxy Note, 2}, {5, One X, 3}

您将构建您的查询:

http://example.com:8999/solr/brands/select?q=*:*&fq={!join from=brand_id to=id fromIndex=products}name:iPad
and the Result will be: {id: "1", name:"Apple"}
  1. 在分布式搜索环境中,您无法在多个节点上跨内核加入。但是,如果您采用自定义碎片方法,则可以在同一节点上跨核心加入。

  2. JOIN查询可为所有匹配的文档产生恒定的分数 - 由嵌套查询计算的"来自"文档的嵌套查询计算的分数不可用于评分"到"文档。

    考虑以上几点,我希望您可以决定要采用哪种方法。

如果您有一个核心,我建议将表导入一个核心并使用加入。但是为此,您必须在data-config.xml和schema.xml中定义表结构和数据类型。我认为您必须已经完成了。在您的data-config文件中,您可以编写查询或定义一个结构,该结构将相应地从十个表中导入所有数据

请参阅我的示例以获取两个表

 <entity name="type_masters" pk="type_id" query="SELECT delete_status as   
 type_masters_delete_status,type_updated,type_id,category_id,type_name FROM   
 type_masters
where type_id='${businessmasters.Business_Type}'"
deltaQuery="select type_id from type_masters where type_updated > 
'${dih.last_index_time}'"
parentDeltaQuery="select business_id from businessmasters where 
Business_Type=${type_masters.type_id}"> 
 <field column="type_id" name="id"/>   
 <field column="category_id" name="category_id" indexed="true" stored="true"   
/>
  <field column="type_name" name="type_name" indexed="true" stored="true" />
       <field column="type_updated" name="type_updated" indexed="true" 
stored="true" />
<field column="type_masters_delete_status" name="type_masters_delete_status" 
indexed="true" stored="true" />

<entity name="category_masters" query="SELECT delete_status as 
category_masters_delete_status,category_updated,category_id,category_name 
FROM category_masters where category_id='${type_masters.category_id}'"
   deltaQuery="select category_id from category_masters where category_updated > '${dih.last_index_time}'"
  parentDeltaQuery="select type_id from type_masters where 
  category_id=${category_masters.category_id}"> 
   <field column="category_id" name="id"/>   
  <field column="category_name" name="category_name" indexed="true"    
    stored="true" />
    <field column="category_updated" name="category_updated" indexed="true" 
   stored="true" />
             <field column="category_masters_delete_status" 
     name="category_masters_delete_status" indexed="true" stored="true" />
           </entity><!-- category_masters -->
      </entity><!-- type_masters -->

最新更新