1

假设我在文档模式中有这些字段:

<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:“不在乎”
  • 类型:“销售订单”
  • 参考数据值:[“abcdefg”,“hijklmn”,“opqrst”]
  • 文本:[“做”、“不”、“关心”、“要么”]

文档 B 具有以下值:

  • id:“不在乎”
  • 类型:“销售订单”
  • 参考数据值:[“hijklmn”,“opqrst”]
  • 文字:[“红色”,“油漆”]

文档 C 具有以下值:

  • 编号:“abcdef”
  • 类型:“客户”
  • 参考数据值:(空)
  • 文本:[“你好”,“世界”,“如何”,“雅”,“做”]

文档 D 具有以下值:

  • id: "hijklmn"
  • 类型:“客户”
  • 参考数据值:(空)
  • 文本:[“你好”,“世界”,“如何”,“雅”,“做”]

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

如果用户输入查询“SalesOrder red paint Customer hello world”,我想构建一个仅返回 Document B 的 Solr 查询。意思是,给我(SalesOrders which text have red OR paint)引用文本有hello的客户或世界

达到此目的的算法如下:

首先,这个查询的结果:

q="你好世界"&fq=type:客户&fl=id

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

q="red paint"&fq=type:SalesOrder&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")
4

2 回答 2

0

你想要实现的是一种对 id 的加入。文档 C 和 D 的 id 作为文档 A 和 B 的参考数据值中的外键

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

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

于 2011-09-21T06:32:45.730 回答
0

您是否尝试过FieldList 参数

您可以指定您的查询应返回哪些字段,然后只需在您按 referenceDataValues:returnedID 过滤的地方执行第二个查询

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

于 2011-09-21T09:14:13.797 回答