【问题标题】:Multiple Indexes in same Solr Core..?同一个 Solr Core 中的多个索引..?
【发布时间】:2012-03-22 19:35:49
【问题描述】:

我正在使用 Apache Solr..我有以下场景..:

我的 PostGreSQL 数据库中有两个表。一种是“汽车”。其他是“经销商

现在我有一个 Cars 的数据配置文件,如下所示:

<document name="offerings">
    <entity name="jc_offerings" query="select * from jc_offerings" >
        <field column="id" name="id" />
        <field column="name" name="name" />
        <field column="display_name" name="display_name" />
        <field column="extra" name="extra" />
    </entity>
</document>

我有一个类似的数据--config.xml 用于“Dealers”。它具有与 Cars 相同的字段:name、extra

现在在我的 Schema.xml 中,我定义了以下字段:

<fields>
  <field name="id" type="string"   indexed="true" />
  <field name="name" type="name"  indexed="true" />
  <field name="extra" type="extra"  indexed="true"  /> 

  <field name="CarsText" type="text_general" indexed="true" 
    stored="true" multiValued="true"/>
</fields>

<uniqueKey>id</uniqueKey>
<defaultSearchField>CarsText</defaultSearchField>
<copyField source="name" dest="CarsText"/>
<copyField source="extra" dest="CarsText"/>

现在我想像这样搜索:“名字是 Maruti”..那么 Solr 将如何知道是否搜索 ::: Cars Field : name OR Dealer Field "name"..?

我已阅读以下链接:http://wiki.apache.org/solr/MultipleIndexes

但我无法理解是如何工作的..??

阅读该链接后:我在我的 CarsDealers *data-config.xml* 中创建了另一个字段。类似于:

<field name="type" value="car" />  : in Cars date-config.xml

<field name="type" value="dealer" />  : in Cars date-config.xml

然后在 Schema.xml 中我创建了一个新字段:

<field name="type" type="string"   indexed="true" stored="true" />  

然后我查询了类似的内容:

localhost:8983/solr/select?q=name:Maruti&amp;fq=type:dealer

但它确实有效..!!

那我该怎么办??

【问题讨论】:

    标签: solr indexing


    【解决方案1】:

    向类型字段添加默认值将确保将类型值设置为cars|dealer

    您必须单独索引来源。然后使用复制字段,您可以轻松过滤cars|dealer

    这似乎有点棘手,并且在上面提到的多索引链接中没有很好地解释。

    【讨论】:

      【解决方案2】:

      如果汽车和经销商的字段相同,您可以使用一个索引,对象定义如下:

      <fields>
        <field name="id" type="string"   indexed="true" stored="true"/>
        <field name="name" type="name"  indexed="true" stored="true" />
        <field name="extra" type="extra"  indexed="true" stored="true" /> 
        <field name="description_text" type="text_general" indexed="true" stored="true" multiValued="true"/>
        <field name="type" type="string" indexed="true" stored="true" />
      </fields>
      

      这对汽车和经销商都有效(因此您不需要有 2 个索引),并且您将使用“类型”字段来确定您想要“经销商”还是“汽车”(我'正在使用相同的系统来过滤掉相似类型的对象,只有很小的“语义”差异)

      您还需要将 stored="true" 添加到要检索的字段中,否则您只能将它们用于搜索(因此 index="true")

      【讨论】:

      • 你仔细阅读我的问题了吗..??..我知道我已经这样做了..但事实是:它不起作用..当我查询类型时,什么都没有出现结果..我该怎么办??
      • 我仔细阅读了您的问题,即使它不是完美的英语。据我所知,您仍然有多个索引。您应该按照我的示例将所有内容合并到一个索引中。您的字段“类型”也有 2 个默认值,在 2 个索引之间拆分。另外,当您查询“Maruti”而不是其他内容时,输出是什么?
      • 在你的例子中:你提到了“type”字段..现在如果你写“fq=type:Samuele”..会发生什么..??..你需要在某处定义类型..像“汽车”或“经销商”..SOLR 应该能够知道有多少类型可用..您是如何实现的..??
      • 我只是将该字段视为任何其他字段,并在索引时填充它。你有一个 postgres 数据库吗?所以你知道你是在拉“汽车”物品还是“经销商”物品。您可以轻松地将值从那里传递给 solr(或者像我一样编写一个插件,但我需要管理更大更复杂的数据)
      • @Samuele Mattiuzzo 建议您在 Solr 模式中添加一个类型字段。从“汽车”向索引中添加行时,您使用“汽车”类型插入。从“dealers”向索引添加行时,您使用“dealer”类型插入。然后查询一个或另一个你会做 ?q=*:*&fq=type:car 或 ?q=*:*&fq=type:dealer 。希望这会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多