3

我基本上希望 Solr 为我的搜索参数搜索多值字段的每条记录。请继续阅读我的示例:

我正在使用 Solr 来索引我的数据。我有与给定产品匹配的并行数组(以多值字段的形式)中的应用程序数据。请参阅以下示例,其中品牌、型号和年份是多值字段:

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
<-solr record end->

我正在使用过滤器查询 (&fq=) 来缩小我的选择范围。问题是,如果有人查找 2000 Acura Integra,它会匹配上面的记录,但由于品牌、型号和年份数据是并行编码的,因此该产品实际上没有 2000 Acura Integra。Solr 匹配 make 字段中的 make、模型字段中的模型和 year 字段中的年份(应该如此)并返回此结果,并且不尊重我的并行性。到目前为止,我的查询看起来像这样:


fq=make:"acura"&fq=model:"integra"&fq=year:2000 (I would normally escape URL characters when I POST to Solr, this is just an example)

所以我的解决方案是创建另一个多值字段,称为汇总字段,我将在其中将所有品牌、型号、年份和其他数据(如引擎)放在一起,并用空格分隔。有必要在单词周围加上引号,这样包含多个单词的术语就不会无意中匹配搜索参数。上面的例子现在看起来像这样:

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
summary: "acura" "integra" "1997" "3.4", "acura" "rsx" "2004" "4.5", "acura" "rsx" "2000", "4.5"
<-solr record end->

然后,我将以下内容添加到我的查询中:

summary:(""acura" AND "integra" AND "2000")

我希望,如果我将其添加到我的查询中,该记录将不再出现,因为摘要字段中没有 acura integra 2000。但是,这不起作用。记录仍然出现。我难住了。有没有人有这个问题的解决方案。这几天一直在杀死我。

我基本上希望 Solr 为我的搜索参数搜索多值字段的每条记录。这可能吗?有没有更好的方法来做我想做的事情?

谢谢

4

3 回答 3

3

我仍然不确定如何在没有汇总字段的情况下保持并行性,但我想出了如何使用汇总字段来做到这一点。而不是使用 AND 语句,我相信在多值字段中搜索每个记录以进行匹配(每个 AND 的术语可以匹配多值字段中的不同行,不一定是同一行),而是输入您的确切术语按照您建立原始摘要记录的相同顺序重新查找,并使用 ~ 运算符。

看看下面的例子:

以下是我希望匹配的多值字段的其中一行中的汇总字段的内容: "Honda" "Accord" "2004" "3.5L"

这是我将运行的查询: summary_field:("\"Honda\" \"2004\"")

仅上述查询将不起作用。即使我可以有一个功能,将来自应用程序的用户输入与构建原始汇总字段的顺序相同,因为应用程序中的用户可以按任何顺序输入一条数据(品牌、型号年份),但可能是我要匹配的数据之间的其他词。在上面的示例中,我想将 Honda 2004 与该记录相匹配。然而,雅阁介于两者之间。

要解决此问题,只需使用 ~n 运算符,其中 n 是您正在搜索的术语之间的其他术语的最大数量。因此,如果我改为使用:

summary_field:("\"Honda\" \"2004\""~1)

我是说在本田和 2004 年之间,有可能还有 1 个词。因此,上述查询将匹配。即使您在汇总字段中添加多个术语,只要您使用相同顺序的值查询它,并且您的模糊搜索逻辑使用的数字将是 2 个值之间的最大距离,您的查询将始终正确匹配正确的汇总字段。因此,如果您有 20 个字段添加到汇总字段以保持并行性,则只需使用 ~18,因为这是在最坏情况下用户可以选择的单词之间的最大可能距离。

于 2010-02-12T08:03:52.670 回答
3

看来您的架构不太正确。您需要完全非规范化数据并为每辆车创建一个文档。“车辆”的含义取决于您将运行的搜索类型。例如,一个可能的模式是:

sku: 1234
make: acura
model: integra
years: 1997
engines: 3.4, 4.5

sku: 1235
make: acura
model: rsx
years: 2000, 2004
engines: 4.5

汇总字段将是 make+model+years+engines 的 copyField

于 2010-02-11T13:33:51.547 回答
0

你不能只做如下查询吗?

make:acura AND model:integra AND year:2000

即没有围绕品牌和型号的引号。

于 2010-02-11T14:43:04.270 回答