Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理多个连接多值字段的SOLR模式_Solr - Fatal编程技术网

处理多个连接多值字段的SOLR模式

处理多个连接多值字段的SOLR模式,solr,Solr,假设您有如下文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014, pag 345 doc2 id:2 text:... references: Journal2, 2013, pag 678 references: Journal1, 2014, pag 901 如何构造模式以通过引用搜索文档? 我的第一个假设是这样的: <doc> <

假设您有如下文档:

doc1:
 id:1
 text: ...
 references: Journal1, 2013, pag 123
 references: Journal2, 2014, pag 345

doc2
 id:2
 text:...
 references: Journal2, 2013, pag 678
 references: Journal1, 2014, pag 901
如何构造模式以通过引用搜索文档? 我的第一个假设是这样的:

<doc>
 <field name="id">1</field>
 <field name="text">...</field>
 <field name="ref_journal">Journal1</field>
 <field name="ref_journal">Journal2</field>
 <field name="ref_year">2013</field>
 <field name="ref_year">2014</field>
 <field name="ref_page">123</field>
 <field name="ref_page">456</field>
</doc>
<doc>
 <field name="id">2</field>
 <field name="text">...</field>
 <field name="ref_journal">Journal2</field>
 <field name="ref_journal">Journal1</field>
 <field name="ref_year">2013</field>
 <field name="ref_year">2014</field>
 <field name="ref_page">678</field>
 <field name="ref_page">901</field>
</doc>
<fieldType name="ref" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*;\s*"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
<doc>
 <field name="id">1</field>
 <field name="text">...</field>
 <field name="ref">journal:Journal1; year:2013 ; page:123</field>
 <field name="ref">journal:Journal2; year:2014 ; page:456</field>
</doc>
<doc>
 <field name="id">2</field>
 <field name="text">...</field>
 <field name="ref">journal:Journal2; year:2013; page:678;</field>
 <field name="ref">journal:Journal1; year:2014; page:901;</field>
</doc>

1.
...
日志1
日志2
2013
2014
123
456
2.
...
日志2
日志1
2013
2014
678
901
但通过这种方式,我无法强制第一个
ref\u journal
字段连接到第一个
ref\u year
字段,因此搜索
ref\u journal:Journal1和ref\u year:2013
将错误地匹配这两个文档。
有没有一种方法可以拥有多个“连接”的多值字段?

看看,它提供了一些支持。请注意,它不能完全与sql db相比,虽然有一些限制,但它确实支持一些用例。如果你真的需要这个功能,去看看吧,即使它让其他事情变得更困难,也可能会帮你省钱。

几天前我也遇到了类似的问题。所以,我可以建议你一个不同的解决方案

让我们借助您提供的数据。我会将这2个文档存储为4个不同的Solr文档。如果简化文档结构,而不是执行繁重的连接查询,那么Solr总是更好

<doc>
 <field name="id">1</field>
 <field name="text">...</field>
 <field name="somefield">doc1</field>
 <field name="ref_journal">Journal1</field>
 <field name="ref_year">2013</field>
 <field name="ref_page">123</field>
</doc>
<doc>
 <field name="id">2</field>
 <field name="text">...</field>
 <field name="somefield">doc1</field>
 <field name="ref_journal">Journal2</field>
 <field name="ref_year">2014</field>
 <field name="ref_page">456</field>
</doc>
<doc>
 <field name="id">3</field>
 <field name="text">...</field>
 <field name="somefield">doc2</field>
 <field name="ref_journal">Journal2</field>
 <field name="ref_year">2013</field>
 <field name="ref_page">678</field>
</doc><doc>
 <field name="id">4</field>
 <field name="text">...</field>
 <field name="somefield">doc2</field>
 <field name="ref_journal">Journal1</field>
 <field name="ref_year">2014</field>
 <field name="ref_page">901</field>
</doc>

1.
...
文件1
日志1
2013
123
2.
...
文件1
日志2
2014
456
3.
...
文档2
日志2
2013
678
4.
...
文档2
日志1
2014
901
现在,如果查询
ref\u journal:Journal1和ref\u year:2013
,则只匹配单个Solr文档。我还添加了一个名为“somefield”的字段,该字段表示前两个Solr文档属于单个文档,而其他两个文档属于不同的文档。这样您就保留了与文档相关的所有信息。并在文件之间建立了适当的连接

还有一件事。请不要担心数据冗余和查询性能。因为简单查询总是比连接查询提供更好的性能。Solr在连接方面没有那么好


希望这会有所帮助。

如果您只需要搜索精确值,一个棘手的解决方案是使用适当的标记器将多个属性连接到一个多值字段中

定义如下所示的“ref”类型:

<doc>
 <field name="id">1</field>
 <field name="text">...</field>
 <field name="ref_journal">Journal1</field>
 <field name="ref_journal">Journal2</field>
 <field name="ref_year">2013</field>
 <field name="ref_year">2014</field>
 <field name="ref_page">123</field>
 <field name="ref_page">456</field>
</doc>
<doc>
 <field name="id">2</field>
 <field name="text">...</field>
 <field name="ref_journal">Journal2</field>
 <field name="ref_journal">Journal1</field>
 <field name="ref_year">2013</field>
 <field name="ref_year">2014</field>
 <field name="ref_page">678</field>
 <field name="ref_page">901</field>
</doc>
<fieldType name="ref" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*;\s*"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>
<doc>
 <field name="id">1</field>
 <field name="text">...</field>
 <field name="ref">journal:Journal1; year:2013 ; page:123</field>
 <field name="ref">journal:Journal2; year:2014 ; page:456</field>
</doc>
<doc>
 <field name="id">2</field>
 <field name="text">...</field>
 <field name="ref">journal:Journal2; year:2013; page:678;</field>
 <field name="ref">journal:Journal1; year:2014; page:901;</field>
</doc>
请注意:

  • 不能在数据中使用分号:如果需要,必须找到另一个合适的分隔符

  • positionIncrementGap
    必须大于ref中可能的属性数,以避免不同字段之间的匹配

  • 不能使用范围查询


这不是一个通用的解决方案,但在大多数情况下,它是足够的,而且可能更容易实现。

是的,但如果我搜索
text:some text
,它会在结果中找到成倍的文档。还是我遗漏了什么?是的。因为这也不是您提供的唯一过滤器。
text
字段中的数据与前两个solr文档相同。因此,您应该获得多个文档。但这不是问题。提供更多筛选器可以解决此问题。@cpburnz为什么删除我的更改?他们是否违反了任何规则?@Zac与其在别人的帖子中添加重要内容,不如发布自己的答案。