【问题标题】:In Solr, How to query against one field for distinct set of values in a multi-valued field在 Solr 中,如何针对一个字段查询多值字段中的不同值集
【发布时间】:2010-02-11 08:20:46
【问题描述】:

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

谢谢

【问题讨论】:

    标签: full-text-search solr parallel-processing multivalue


    【解决方案1】:

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

    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

    【讨论】:

    • 嘿。这正是我最初的解决方案,而且效果很好!唯一的问题是,当您访问我网站的产品屏幕时,您看到的是应用程序数量而不是产品数量。如果相同的品牌、型号和年份属于一个 sku,并且只有引擎或子型号不同,我只是在产品下方的“适合”部分说明这一点。例如,我可能会将 4 个应用程序一起放入我网站上的 1 个产品“盒子”中。搜索结果应该显示正在查看 1 of 1。而是显示正在查看 4 of 4(即使屏幕上只有一个框)。因此,我的新架构...
    • @Dan:看看字段折叠:wiki.apache.org/solr/FieldCollapsing
    • 因为问题是一个 SKU (12345) 可以容纳多辆车。将每个 SKU + 车辆作为自己的记录很好,但将它们视为客户是可怕的。通过卷起每辆车(和应用程序)并将其附加到它适合的同一个 SKU,它使其更易于查看。但是,您可能每页查看 10 个应用程序,但您只有 3 个“盒子”,用户可以在其中购买东西。所以它说查看项目 1 到 10,但只列出了 3 个带有图片的“框”和一个“点击购买按钮”。
    • 对不起,丹,但这些问题确实是您特定项目的具体问题,我无法回答。
    • 没关系。无论如何感谢您的帮助。我来看看Field Collapsing
    【解决方案2】:

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

    看看下面的例子:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      你不能只做如下查询吗?

      make:acura AND model:integra AND year:2000
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 1970-01-01
        相关资源
        最近更新 更多