【问题标题】:Complex query in Solr, is it possible?Solr中的复杂查询,可能吗?
【发布时间】:2011-03-31 13:34:47
【问题描述】:

大家好,我是 Solr 新手,想完成以下场景(如下),但不确定 Solr 是否能够处理这样的情况:

问题很简单,我想建立一个价格比较搜索。有我的理性数据库表:

t_company:
company_id
company_name

t_product:
product_id
product_price

t_company_product:
company_product_id
company_id
product_id

在 Solr 中,我想执行以下搜索 - 以最低的 TOTAL 价格获取所有提供一种或多种特定产品的公司(因此,如果您选择螺丝、钉子和石板,我想给出总购买最低价格)。

在设置架构时,我将业务设置为主要实体,并将 product_ids 和 product_prices 设置为两个多值字段。

我可以这样查询吗?怎么求和?

这是我所有的 XML schema.xml 和 data-config.xml

<document name="companies">
<entity name="company" dataSource="dsCompany" 
        query="select 
                      newid() as row_id,
                      company_id, 
                      company_name
               from 
                    t_company WITH (NOLOCK)">
    <field column="row_id" name="row_id" />
    <field column="company_id" name="company_id" />
    <field column="company_name" name="company_name" />
    <entity name="products" query="select 
                                        company_product_id, 
                                        product_id,
                                        price
                                   from 
                                        t_company_product WITH (NOLOCK)
                                   where 
                                        company_id='${company.company_id}'"
                                        dataSource="dsCompany">
        <field name="company_product_id" column="company_product_id" />
        <field name="product_id" column="product_id" />
        <field name="price" column="price" />                       
    </entity>
</entity>

<fields>
    <field name="row_id" type="string" indexed="true" stored="true" required="true"/>
    <field name="company_id" type="integer" indexed="true" stored="true" required="true" />
    <field name="company_name" type="text" indexed="true" stored="true"/>
    <field name="service_id" type="integer" indexed="true" stored="true" required="true" />
    <field name="price" type="tfloat" indexed="true" stored="true" required="true" />
 </fields>

我们将不胜感激任何反馈!!!

【问题讨论】:

  • 多年来我一直在 Solr 或 Sphinx 中寻找类似的东西。基本上,能够将结果连接到另一个表以过滤结果会很好。 Sphinx 有 MVA,但使用起来非常麻烦。

标签: search lucene solr multivalue


【解决方案1】:

您可以使用函数查询按总和对结果进行排序,请参阅here。 在我的上一个项目中,我们使用了 4.0 的夜间版本,它运行良好。它包含比 1.4 多得多的功能,值得您使用非发布版本冒的小风险。

更新:
要使用总和,您可以尝试为每个产品价格添加一个动态字段(我不知道如何将总和与多值字段一起使用,或者是否可能)。

添加到数据配置
&lt;field name="price_${products.product_id}" column="price" /&gt;

添加到 schema.xml
&lt;dynamicField name="price_*" type="decimal" indexed="false" stored="true" /&gt;

如果我理解正确,您应该可以使用如下查询:
q=:&sort=sum(price_"id for nails",price_"id for 螺丝",price_"id for ...") asc

【讨论】:

  • 谢谢,您能否发布一个示例,说明我将如何使用函数查询? Sum 应该在 1.3 中已经可用
【解决方案2】:

可能在 1.4.1 中,在当前的主干 (4.0) 中没有或至少不容易。

在 solr 1.4 中有一个字段折叠可以对返回的记录执行聚合。在trunk solr 4.0中,这变成了一个只能执行最小/最大类型查询的分组选项(据我所知)。

文档可以在这里找到:

http://wiki.apache.org/solr/FieldCollapsing

请记住,您必须扩展关系(将其视为对所涉及表的 1 个大型非规范化视图)。

【讨论】:

  • 我很奇怪,为什么您的回复被否决了?你能看一下更新模式,看看它是否改变了什么?谢谢!
  • Solr 1.4 中没有字段折叠
  • 知道了,还有其他方法可以进行聚合吗?我说的有可能吗?
  • 这看起来不错,但我的理解是这是未发布的。你是说我可以修补它吗?
  • 是的,这还没有发布。您需要修补 Solr 并自己重新编译。我的一些同事发现它有效。
【解决方案3】:

Solr 并非旨在取代关系数据库。如果您仍想索引关系内容,则需要对它们进行非规范化,因此将包含冗余数据。因此,对于大多数查询,结果的计数将关闭,例如,仅搜索公司名称会产生比预期更高的结果总数。但是,随着字段崩溃,您可以摆脱它。但是,如果您使用分面,则不可能从那里消除重复。

如果你用你提到的所有数据形成一个单一的模式,那么你可以在一定程度上执行关系查询。谷歌“solr issue 2272”以获取详细信息。目前只能在单个架构内实现。

我相信目前无法在搜索引擎中执行求和运算。我可能错了,如果有人知道怎么做,我也会很感兴趣。

【讨论】:

  • 我知道 Solr 不能替代关系数据库,但这似乎是对搜索非常关键的基本功能。我目前正在调查 FiledColpasing 补丁是否能解决我的问题。
【解决方案4】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多