【问题标题】:Joining Solr cores in Datastax Enterprise null value error在 Datastax Enterprise 中加入 Solr 核心空值错误
【发布时间】:2016-03-22 10:25:12
【问题描述】:

我正在尝试使用以下方法加入两个 Solr 核心:

http://localhost:8983/solr/keyspace.solr_table1/select/?q={!join+fromIndex=keyspace.solr_table2}name:Doe&indent=true&wt=json&force=true

Cassandra 中的列族具有相同的键空间,但它们没有相同的分区键(名称不同,数据类型也不同)。第一个列族有一个分区键“id”(int),第二个是“id_text”(bigint)。我的搜索位于“名称”列(二级索引,两个列族中的列名相同),我使用的是 force=true。

这样的结果是:

{
  "responseHeader":{
    "status":400,
    "QTime":1,
    "params":{
      "q":"{!join fromIndex=keyspace.solr_table1}name:Doe",
      "indent":"true",
      "force":"true",
      "wt":"json"}},
  "error":{
    "msg":"undefined field: \"null\"",
    "code":400},
  "params":"q={!join+fromIndex%3Dkeyspace.solr_table2}name:Doe&indent=true&force=true&wt=json"}

如果我在两个核心中进行简单搜索,我会得到结果:

http://localhost.40:8983/solr/keyspace.solr_table1/select?q=nom%3ADoe&wt=json&indent=true

两个列族在二级索引中都包含空值:名称,这可能是连接不起作用的原因吗?如果是这样,有没有办法告诉忽略是否有空值并对非空值进行连接?

DSE 版本是 4.8。 第一个核心的架构是:

 <schema name="solr_quickstart" version="1.1">
 <types>
  <fieldType name="bigint" class="solr.TrieLongField"/>
  <fieldType name="string" class="solr.StrField"/>
  <fieldType name="text" class="solr.TextField">
    <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
  </fieldType>
  <fieldType name="int" class="solr.TrieIntField"/>
 </types>
 <fields>
<field name="id_individu" type="int" indexed="true"  stored="true"/>
<field name="nom" type="string" indexed="true"  stored="true"/>
<field name="prenom" type="string" indexed="true"  stored="true"/>
<field name="nom_conjoint" type="string" indexed="true"  stored="true"/>
<field name="prenom_conjoint" type="string" indexed="true"  stored="true"/>
<field name="id_gedcom" type="bigint" indexed="true"  stored="true"/>
<field name="all" type="string" docValues="true" indexed="true" stored="false" multiValued="true"/>
 </fields>

<defaultSearchField>nom</defaultSearchField>
<uniqueKey>(id_individu)</uniqueKey>
<copyField source="nom" dest="all"/>
<copyField source="prenom" dest="all"/>
<copyField source="nom_conjoint" dest="all"/>
<copyField source="prenom_conjoint" dest="all"/>
<copyField source="id_gedcom" dest="all"/>

</schema>

第二个核心的架构是

    <schema name="solr_quickstart" version="1.1">
 <types>
  <fieldType name="bigint" class="solr.TrieLongField"/>
  <fieldType name="string" class="solr.StrField"/>
  <fieldType name="text" class="solr.TextField">
    <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
  </fieldType>
  <fieldType name="int" class="solr.TrieIntField"/>
 </types>
 <fields>
<field name="id" type="bigint" indexed="true"  stored="true"/>
<field name="nom" type="string" indexed="true"  stored="true"/>
<field name="prenom" type="string" indexed="true"  stored="true"/>
<field name="nom_conjoint" type="string" indexed="true"  stored="true"/>
<field name="prenom_conjoint" type="string" indexed="true"  stored="true"/>
<field name="id_gedcom" type="bigint" indexed="true"  stored="true"/>
<field name="all" type="string" docValues="true" indexed="true" stored="false" multiValued="true"/>
 </fields>

<defaultSearchField>nom</defaultSearchField>
<uniqueKey>(id)</uniqueKey>
<copyField source="nom" dest="all"/>
<copyField source="prenom" dest="all"/>
<copyField source="nom_conjoint" dest="all"/>
<copyField source="prenom_conjoint" dest="all"/>
<copyField source="id_gedcom" dest="all"/>

</schema>

非常感谢您的任何意见!

【问题讨论】:

  • 能否提供 DSE 版本和两个表模式?
  • 我编辑了我的初始帖子并添加了核心和 DSE 版本 (4.8) 的架构

标签: solr cassandra


【解决方案1】:

如果您在没有“强制”选项的情况下运行它,您会收到以下消息:

"加入的 Solr 核心必须具有相同的分区键验证器;from 核心具有:org.apache.cassandra.db.marshal.LongType;to 核心具有:org.apache.cassandra.db.marshal.Int32Type\ n如果要强制加入,请将 force=true 作为本地参数传递。"

这与文档中指定的在 DSE join docs 工作的连接要求一致

因此,如果您想加入,恐怕您必须进行微调。您可能还想为 solr 架构使用 1.5 版。

此外,如果您想使用“force”参数,您需要更改语法。检查 DSE 文档以了解使用“强制”时的正确语法。

强制加入时的错误信息应该会更好。

希望这会有所帮助。

【讨论】:

  • 感谢您的回复!我将尝试为其中一个表添加一个额外的 id 列,以便拥有相同的分区键。我对 force = true 使用了正确的语法,但我确实得到了同样的错误。
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 2016-11-05
  • 2018-03-19
相关资源
最近更新 更多