【问题标题】:Solr: how to query particuler entity when multipleSolr:多个时如何查询特定实体
【发布时间】:2016-07-11 09:54:28
【问题描述】:

我开始学习 Solr(使用 5.5.0 版)。我正在使用 managed-schema 和 data-congif.xml 文件来分析两个 sql server 表:Company & Contact。

我能够从 UI 执行数据导入,一次选择一个实体。

这是我收到的公司信息:

索引已完成。添加/更新:8,293 个文档。删除了 0 个文档。 (时长:01s) 请求:1 (1/s),获取:8,293 (8,293/s),跳过:0,处理:8,293 (8,293/s) 开始:不到一分钟前

这是我收到的联系人信息:

索引已完成。添加/更新:81 个文档。删除了 0 个文档。 请求:1,获取:81,跳过:0,处理:81 开始时间:不到一分钟前

当我单击“查询”部分时,我想执行查询以查看所有联系人和/或公司记录,不一定要合并,但只能查询它们。

我不确定如何执行此操作,是否可以获得一些帮助以了解如何指定要针对哪个实体执行查询?

这是我修改的 2 个文件:

data-cofig.xml:

<dataConfig>
  <dataSource type="JdbcDataSource" 
              driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
              url="jdbc:sqlserver://sql.server.com\test;databaseName=test"
              user="testusr" 
              password="testpwd"/>
  <document>
    <entity name="Company" pk="CompanyID" query="SELECT * FROM tblCompany">
       <field column="CompanyID" name="company_companyid"/>
       <field column="Name" name="company_name"/>
        <field column="Website" name="company_website"/>
        <field column="Description" name="company_description"/>
        <field column="NumberOfEmployees" name="company_numberofemployees"/>
        <field column="AnnualRevenue" name="company_annualrevenue"/>
        <field column="YearFounded" name="company_yearfounded"/>
    </entity>

    <entity name="Contact" pk="ContactID" query="SELECT * FROM tblContact">     
      <field column="ContactID" name="contact_contactid"/>
      <field column="FirstName" name="contact_firstname"/>
      <field column="MiddleInitial" name="contact_middleinitial"/>
      <field column="LastName" name="contact_lastname"/>
      <field column="Email" name="contact_email"/>
      <field column="Description" name="contact_description"/>
    </entity>
  </document>
</dataConfig>

托管模式:

  <!-- Company Begin -->
  <field name="company_companyid" type="string" indexed="true"/>
  <field name="company_name" type="string" indexed="true"/>  
  <field name="company_website" type="string" indexed="true"/>  
  <field name="company_description" type="string" indexed="true"/>
  <field name="company_numberofemployees" type="string" indexed="true"/>
  <field name="company_annualrevenue" type="string" indexed="true"/>
  <field name="company_yearfounded" type="string" indexed="true"/>
  <!-- Company End -->

  <!-- Contact Begin -->
  <field name="contact_contactid" type="string" indexed="true" />
  <field name="contact_firstname" type="string" indexed="true"/>
  <field name="contact_middleinitial" type="string" indexed="true"/>
  <field name="contact_lastname" type="string" indexed="true"/>
  <field name="contact_email" type="string" indexed="true"/>
  <!-- Contact End -->

更新

我尝试使用 fl 字段选择 company_companyid,但没有得到任何结果。

我包括一个屏幕截图:

【问题讨论】:

  • 只是为了确保我理解,您希望能够执行查询并获取例如与联系人实体相关的字段?
  • 我希望能够根据需要执行查询并获取公司或联系人的字段,而不是组合。查询公司字段或查询联系人字段。我希望这是有道理的。谢谢。

标签: apache search solr lucene


【解决方案1】:

要根据需要从文档中获取字段,请使用fl。例如,如果您使用 SolrJ,您将拥有类似 query.set("fl", "fieldA, fieldB") 的内容。

在 URL 中,它看起来像这样:http://host:port/solr/coreName/select?q=*%3A*&amp;fl=fieldA,fieldB&amp;wt=json&amp;indent=true

【讨论】:

  • 我会试一试,让你知道。我知道我使用的是 Solr 版本 5.5.0,不知道如何确定这是否也是 SolrJ
  • 我尝试了您的推荐,但没有得到任何结果。我在 fl 框下输入:company_companyid - 您可以看到它包含在 data-config.xml 文件中的公司实体下
  • 尝试将 stored=true 添加到所有架构字段。搜索时将返回一个存储的字段。您需要执行另一次完全导入才能使更改生效。
  • 我为每个公司和联系人添加了 stored=true ,然后执行了另一个完全导入。当我进行完全导入时,在实体下,我没有选择公司,也没有选择联系人,我只是单击执行,它会处理公司和联系人之间正确数量的记录。然后我尝试了一个新的查询,首先输入参数:company_name,它返回所有公司名称,这很好。但是当我输入:contact_firstname,仍然没有返回任何东西。如果联系人记录也在处理中,您认为为什么会发生这种情况?
  • 我之前没有注意到这一点,但是您的配置文件中有两个实体。根据我自己的测试和我对 dih 的了解,Solr 可能会将您的第一个实体视为根实体,相应地导入,然后不一定知道如何处理第二个实体。您需要嵌套实体或使用连接将列放在一个语句中。连接更可取,因为使用嵌套实体会降低导入期间的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多