当前位置: 首页 > 知识库问答 >
问题:

elasticsearch-具有典型电子商务数据的嵌套文档排序/评分

冉子石
2023-03-14

我正在尝试将我们的电子商务搜索系统转移到弹性搜索。我们有一堆产品,每个产品都可以有多个报价(由商家出售)。文档的大致格式是

{
    "productId": 1234,
    "title": "Apple Macbook Pro",
    "description": "Macbook Pro ModelNo:ABC 2.4GHz 8GB RAM",
    "offers": [
        {
            "offer_id": "123",
            "offer_seller": "ebay"
            "offer_price": 900
            "condition": "refurb"
            "times_bought": 25,
        },        
        {
            "offer_id": "124",
            "offer_seller": "amazon"            
            "offer_price": 1200,
            "condition": "new",
            "times_bought": 35,
        },
        {
            "offer_id": "125",
            "offer_seller": "bestbuy"                        
            "offer_price": 1400
            "condition": "new",
            "times_bought": 10,
        }
    ]
}

{
    "productId": 1235,
    "title": "Apple Macbook Air",
    "description": "Macbook Air ModelNo:ABC 1.2GHz 4GB RAM",
    "offers": [

        {
            "offer_id": "123",
            "offer_seller": "ebay"
            "offer_price": 600
            "condition": "refurb"
            "times_bought": 50,
        },        
        {
            "offer_id": "124",
            "offer_seller": "amazon"            
            "offer_price": 999,
            "condition": "new",
            "times_bought": 55,
        },
        {
            "offer_id": "125",
            "offer_seller": "bestbuy"                        
            "offer_price": 1100
            "condition": "new",
            "times_bought": 20,
        }
    ]
}  

更多事实:

  1. 产品更新率高于产品更新率

这是我的问题

{
"query" : {
"function_score": {
    "boost_mode": "replace",
    "multi_match": {
         "query": "macbook",
         "fields": [
            "title^10",
            "description^5"
         ]
      },
    "script_score": {
        "params": {
            "param1": 2,
            "param2": 3.1
        },
        "script": "_score * doc['offers.times_bought'].value / pow(param1, param2)"
    }
}
}
}

我的问题1。我使用嵌套类型进行报价,因为我想使用offer\u价格对产品进行排序。我读到家长/孩子不支持排序,但事实上每次更新产品都会重新索引整个产品,这让我怀疑家长/孩子是否是更好的选择
2。我想为每件退回的产品提供最好的(1或2)优惠。有没有办法为每个返回的结果对嵌套文档进行排序,或者我应该自己排序
3。如果我想在索引之外存储“times_Build”,因为它比索引中的任何其他内容更新得更频繁。如何将其插入排名?我可以扩展弹性搜索评分类并使用此外部数据结构对其进行修改吗?

任何意见/建议将不胜感激。

共有1个答案

曾实
2023-03-14

怎么样:

  • 在索引代码中进行“最佳报价”聚合。这意味着您将其存储在KV商店(redis、Couchbase等)中,并在每次特定产品的报价发生变化时重新填充。无论如何,您可能都有可用的数据来执行此操作。
  • 这样,您只需索引_price来参考最佳报价的价格。
  • THIS正确地按正确的顺序返回产品。
  • 最后(在ES按顺序退回产品后),您可以调用product-id(s)到您的kv商店,为每个退回的产品获取整个顶部(1或2)报价。

这种电子商务和KV商店的结合看起来可能比它的价值更麻烦,但是相信我,它最终会奇迹般地降低复杂性。

答案是1和2。

至于3:您可以将其建模为父/子,这将允许使用单独的间隔进行索引,以及性能权衡,但我不确定是否诚实。

有一点

 类似资料:
  • 我的索引中有以下类型的文档,但由于深度嵌套方面,我找不到正确排序的方法。 文档示例: 我希望排序或提升在匹配时间,以便我可以得到排序的文档(asc/desc)与约束和内嵌套文档和内嵌套文档

  • 问题内容: 我正在尝试在Elasticsearch中进行嵌套排序,但到目前为止没有成功。 我的数据结构: 我想根据文档中第一作者的姓氏对文档进行排序。 使用的映射: 使用SearchRequestBuilder(JAVA)进行排序: 这行得通,但没有给出想要的结果(例如,首先是“叫卖”,然后是“罗杰”)。 我错过了什么吗?有没有办法表明Elasticsearch访问数组authorList的ind

  • 我试图在Elasticsearch中进行嵌套排序,但到目前为止还没有成功。 我的数据结构: 我想根据文档中第一作者的姓氏对文档进行排序。 使用SearchRequestBuilder(JAVA)进行排序: 这是有效的,但不能给出想要的结果(例如,首先是“霍金”,然后是“罗杰”)。 我是不是漏掉了什么?是否有一种方法可以指示Elasticsearch访问数组authorlist的index=0?是否

  • 我是Elasticsearch的新手,如果我问的问题非常简单直接,我会道歉。 我使用以下学生教育细节的映射, 我的数据集中有近15000名学生。文件示例: 我的问题是,我正在尝试做一个简单的查询,以显示那些拥有“BE”学位的学生。但我希望目前拥有BE(工程学士)学位的学生的排名高于同样拥有硕士和博士学位的学生。 从我的例子中,如果我查询“BE”,学生3应该比学生2排名更高。我应该能够根据"endD

  • 问题内容: 我有看起来像这样的文档(以下是两个示例): 和 数组中子文档的格式将始终具有an 和a,但是这些子文档的数量将可变,每个子文档具有不同的值。 我想知道是否可以根据与特定值匹配的值之一对这种格式的文档进行排序。我真的很想能够做到这一点: 通过对文档进行排序下降,其中相关的。文档s 的最终排序为1234,6346。 通过对文档进行排序下降,其中相关的。文档s 的最终排序为6346,1234

  • 问题内容: 我正在编写资产管理应用程序。它允许用户通过向资产添加html控件(例如文本字段,选择菜单等)来存储任意资产属性。然后,该属性的JSON表示成为存储在beddb中的资产JSON文档的一部分。资产在ouchdb中具有以下结构: 我不确定将属性放入数组是否是允许基于属性值搜索资产的最佳方法。将属性直接附加到资产作为属性会更好吗?我正在用Elasticsearch做实验。如果我尝试按原样存储文