使用Solr 5.1.0处理多个MySQL表格?

时间:2015-05-11 07:32:53

标签: java php schema solrcloud solr5

我的MySQL数据库中有30多个表。最近我使用DataImporthandler将我的1个表中的数据导入Solr 5.1.0,并在我的 data-config.xml 文件中导出数据,

select * from table-name

但在我的搜索中,我必须整合10个以上的表格才能提供正确的搜索结果。

这样做的方法是

1)在MySQL数据库中使用 JOIN 查询导入数据并导入

2)通过导入完整数据单独的表来加入 solr核心。

我做什么让它优化?哪个好方法?

2 个答案:

答案 0 :(得分:0)

如果你有一个单核,那么我建议将表导入一个单核并使用连接。这就是我在我的solr 4.9上用cake php和solrphpclient完成的。 但为此你必须在data-config.xml和schema.xml中定义表结构和数据类型。我认为你必须完成。 在您的数据配置文件中,您可以编写查询或定义一个结构,该结构将相应地导入十个表中的所有数据

请参阅我的示例了解两个表

 <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 -->

答案 1 :(得分:0)

  1. 使用MySQL数据库中的JOIN查询导入数据并导入

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

    此处要考虑的优化点将是您要搜索并希望在结果中显示的所有字段。 所以你需要先解决这个问题。您将在哪些字段上搜索并需要显示。

    您需要搜索的字段将其设为indexed =“true”。将所有make设为indexed =“false”。 结果中需要的字段将它们标记为stored =“true”。休息所有make as stored =“false”。

    有些可能需要同时搜索和显示结果。将它们标记为indexed =“true”和stored =“true”。

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

    现在回答你的第二个问题

    通过导入完整数据单独表来加入solr核心。 是的,因为solr 4.0,所以这在solr中是可能的

    详细示例请查看以下链接 https://wiki.apache.org/solr/Join

    但也要考虑它的局限性。

  2. “from”加入的文档的字段或其他属性不可用于处理生成的“to”文档集 (即:您不能返回“from”文档中的字段,就好像它们是“to”文档中的多值字段一样。)

    所以你可以在最后一次通话之前考虑这些要点。

  3. 在这里考虑你有两个核心

    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. 在DistributedSearch环境中,您无法跨多个节点上的核心进行加入。 但是,如果您有自定义分片方法,则可以在同一节点上跨核心进行连接。

    2. Join查询为所有匹配的文档生成常量分数 - 嵌套查询为“从”文档计算的分数无法用于评分“到”文档。

      考虑到以上几点,我希望你能决定你想采取哪种方法。