0

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

select * from table-name

但在我的搜索中,我必须整合 10 多个表格才能给出正确的搜索结果。

这样做的方法是

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

或者

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

我应该怎么做才能优化?哪个是好方法?

4

2 回答 2

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 -->
于 2015-05-11T10:37:04.327 回答
0
  1. 在 MySQL 数据库中使用 JOIN 查询导入数据并导入

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

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

    您需要搜索的字段使它们成为 indexed="true"。其余全部设为 indexed="false"。结果中需要的字段将它们标记为stored="true"。将所有内容都设置为已存储 =“false”。

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

    例如,我的文档中有 15 个字段,但只有 4 个被索引,因为我只想搜索这些字段。其余所有字段都显示在结果中,以便存储。

    现在来回答你的第二个问题

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

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

    但也要考虑它的局限性。

  2. 正在“从”连接的文档的字段或其他属性不可用于处理“到”文档的结果集(即:您不能将“来自”文档中的字段作为多值字段返回“to”文件)。

    因此,您可以在最后决定之前考虑这些要点。

考虑这里你有两个核心

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 查询为所有匹配的文档生成恒定分数——由嵌套查询为“from”文档计算的分数不可用于对“to”文档进行评分。

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

于 2015-05-12T02:21:32.300 回答