【问题标题】:How to force certain fields in mult_match to have exact match如何强制 mult_match 中的某些字段具有完全匹配
【发布时间】:2017-02-06 04:33:14
【问题描述】:

我正在尝试将产品列表的标题与已知产品的数据库相匹配。我的第一个想法是将已知产品及其元数据放入 elasticsearch 并尝试使用 multi_match 找到最佳匹配。我当前的查询类似于:

{
  "query": {
    "multi_match" : {
      "query": "Men's small blue cotton pants SKU123", 
      "fields": ["sku^2","title","gender","color", "material","size"],
      "type" : "cross_fields"
    }
  }
}

问题是有时它会退回颜色错误的产品。有没有办法我可以修改上述查询以仅对索引中颜色字段等于查询字符串中存在的单词的项目进行评分?我正在使用弹性搜索 5.1。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    如果您希望 elasticsearch 仅对满足特定条件的项目进行评分,那么您需要在过滤器上下文中使用 terms query。 由于terms query 不会分析您的查询,因此您必须自己进行分析。一些简单的方法是通过空格和小写进行标记并生成如下所示的查询:

    {
      "query": {
        "bool": {
          "filter": {
            "terms": {
              "color": ["men's", "small", "blue", "cotton", "pants", "sku123"]
            }
          },
          "must": {
            "multi_match": {
              "query": "Men's small blue cotton pants SKU123",
              "fields": [
                "sku^2",
                "title",
                "gender",
                "material",
                "size"
              ],
              "type": "cross_fields"
            }
          }
        }
      }
    }
    

    【讨论】:

    • 感谢您的快速回复。经过一些测试,当颜色只有一个词(如“蓝色”)时,此代码有效,但似乎上述查询也将匹配索引中具有多词颜色的项目,如“浅蓝色”或“深蓝色”。有没有办法只显示关键字中存在颜色字段中所有单词的项目? (它们可能乱序或不连续)
    • 我不相信这是可能的。您可以有一个查询来匹配所有查询标记,但不能反过来。更重要的是,你真的需要这个吗?我的意思是,如果我是用户,那么当我要求蓝色时,我会希望结果中有浅蓝色。在stackoverflow.com/questions/32580295/… 之前也有人问过类似的问题。基本上你可以使用这个查询并在应用程序级别做你想做的事情。
    • 当然,您总是可以使用脚本来实现不同寻常的目标,但我建议您谨慎行事。它可能会产生很大的开销。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多