我可以在Solr查询中返回多个文档字段的值吗?

时间:2011-09-20 22:08:34

标签: java lucene solr nested-queries

假设我在文档架构中有这些字段:

<field name="id" type="string" indexed="true" stored="true" multiValued="false" />
<field name="type" type="string" indexed="true" stored="true" multiValued="false" />
<field name="referenceDataValues" type="string" indexed="true" stored="true" multiValued="true" />
<field name="text" type="text" indexed="true" stored="false" multiValued="true" />

文档A列出了所列字段的值:

  • id:“不在乎”
  • 类型:“SalesOrder”
  • referenceDataValues:[“abcdefg”,“hijklmn”,“opqrst”]
  • text:[“do”,“not”,“care”,“both”]

文件B具有以下价值:

  • id:“不在乎”
  • 类型:“SalesOrder”
  • referenceDataValues:[“hijklmn”,“opqrst”]
  • text:[“red”,“paint”]

文档C具有以下值:

  • id:“abcdef”
  • 类型:“客户”
  • referenceDataValues :( null)
  • text:[“hello”,“world”,“how”,“ya”,“doing”]

文档D具有以下值:

  • id:“hijklmn”
  • 类型:“客户”
  • referenceDataValues :( null)
  • text:[“hello”,“world”,“how”,“ya”,“doing”]

默认搜索仅在文本字段上。

如果用户输入查询“SalesOrder red paint Customer hello world”,我想构建一个仅返回文档B的Solr查询。意思是,让我(引用其文本为红色或油漆的SalesOrders)引用其客户的文字有你好OR世界

达到此目标的算法如下:

首先,这个查询的结果:

q =“hello world”&amp; fq = type:Customer&amp; fl = id

这将是文件C和D,仅包含ID。但是,我想在每个id字段中实际获得这些,而不是文档,因此我可以看到它们是否存在于SalesOrders文档的referenceDataValues字段中。

q =“red paint”&amp; fq = type:SalesOrder&amp; fq = referenceDataValues :(此处嵌套来自上一个查询的id值)

是否可以在第一个查询中返回ID字段的值?如果是,那么这个嵌套查询的语法是什么样的?

现在,我尝试使用的查询如下所示:

q=red paint&start=0&rows=25&fq=type:SalesOrder&fq=referenceDataValues:(_query_:"{!lucene fq=type:CustomerPartyMaster&fl=id} hello world")

2 个答案:

答案 0 :(得分:0)

您要实现的目标是对ID的一种联接。文档C和D的id作为文档A和B的参考数据值中的外键

您可能想查看加入补丁 - https://issues.apache.org/jira/browse/SOLR-2272

如果它不起作用,您可能最终将文档及其参考数据编入索引作为单个实体,以便您可以搜索并相应地过滤。

答案 1 :(得分:0)

您是否尝试过FieldList parameter ??

您可以指定查询应返回的字段,然后执行第二个查询,您可以通过referenceDataValues进行过滤:returnedID

但是当第一个查询的结果包含大量ID时,你需要测试它是如何工作的(我在思考性能)。