【问题标题】:Elasticsearch boosting not working on mulit matchElasticsearch 提升不适用于多匹配
【发布时间】:2017-10-05 22:22:02
【问题描述】:

Elasticsearch 多重匹配没有提升字段,这里是代码。

{
    "size": 15,
    "from": 0,
    "query": {
        "filtered": {
            "query": {
                "multi_match": {
                    "query": "shoes",
                    "fields": ["category^3", "brand^2", "title^1", "description"],
                    "fuzziness": "AUTO"
                }
            },
            "filter": {
                "bool": {
                    "must": [],
                    "should": null
                }
            }
        }
    }
}

理想情况下,我想要的是,如果有人搜索关键字 shoes,他应该得到相关的结果。在这种情况下,它应该看看是否有鞋子的类别,这应该有 3 的提升。然后它应该看看是否有任何品牌中有关键字“鞋子”,这应该有 2 的提升。然后它应该查看标题和描述。

因此,如果产品具有上述所有条件,那么它应该显示出最高的提升。

编辑:这是我的映射。

{
    "mappings": {
        "products": {
            "properties": {
                "variations": {
                    "type": "nested",
                    "index": "not_analyzed"
                }
            }
        }
    }
}

编辑:好吧,我还没有定义该字段其余部分的类型。我想保留它的默认值。其次,我对查询嵌套字段不感兴趣。因为这些通常包括产品的变化,例如颜色、尺寸等。这是一个示例文档。

{
    "title": "100% Cotton Unstitched Suit For Men",
    "slug": "100-cotton-unstitched-suit-for-men",
    "price": 200,
    "sale_price": 0,
    "vendor_id": 32,
    "featured": 0,
    "viewed": 20,
    "stock": 4,
    "sku": "XXX-B",
    "rating": 0,
    "active": 1,
    "vendor_name": "house_of_suits",
    "brand": "armani",
    "category": [
        "men_fashion",
        "traditional_clothing",
        "unstitched_fabric"
    ],
    "image": "imagename.jpg",
    "variations": [
        {
            "variation_id": "34",
            "stock": 5,
            "price": 200,
            "variation_image": "",
            "sku": "XXX-C",
            "size": "m",
            "color": "red"
        },
        {
            "variation_id": "35",
            "stock": 5,
            "price": 200,
            "variation_image": "",
            "sku": "XXX-D",
            "size": "l",
            "color": "red"
        }
    ]
}

【问题讨论】:

  • Boost 不是“寻找”顺序的一个因素。请举一个文档示例(并尝试 ^300 ^200 ^100 而不是 ^3 ^2 ^1)
  • 我已经尝试了您的建议,添加了 ^300 ^200 ^100 但对评分完全没有影响。
  • 您能否打印完整的文档映射,以便我们可以看到这些字段的字段和数据类型。匹配查询旨在在分析的字段上运行,但我看到您的变体嵌套对象没有被分析。
  • @zachdb86 我已经通过回答更新了
  • 感谢您发布示例文档。我看到您要搜索的字段没有嵌套。我已经更新了答案以反映这一点。另外,也许这是一个疏忽,但我发现缺少描述。请尝试使用更新后的查询运行解释

标签: elasticsearch elasticsearch-plugin


【解决方案1】:

过滤查询已弃用,应替换为至少包含一个必须子句和一个过滤子句的布尔值。此外,您的字段提升是正确的,但是,根据您定义的类型, multi_match 得分不同。默认类型 best_fields 使用最佳字段的 _score。在下面的示例中,下面的示例使用 most_fields 类型,它结合了每个字段的分数,并且应该完成您想要的。我会查看this 页面以了解有关不同类型的更多信息。

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "shoes",
            "fields": ["category^3", "brand^2", "title^1", "description"],
            "type": "most_fields"
          }
        }
      ],
      "filter": {

      }
    } 
  }
}

【讨论】:

  • 谢谢 zachdb 。我已按照您的指示进行操作,但由于某种原因,我仍然没有在这些领域得到提升。其次,相关性的最高分数小于 1。但不止一个字段中有查询。您是否认为它可能与映射有关。我已经编辑了我的答案并包含了我的地图
  • 在这个查询中,提升因子可能很小,可以看出差异。你怎么知道,你没有得到提升?
  • 能否请您对此查询运行解释并粘贴输出。
  • @zachdb86 我已经尝试了上面的查询,但它得到了 0 次点击
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2011-04-05
  • 2019-06-15
  • 1970-01-01
相关资源
最近更新 更多