如何强制mult_match中的某些字段具有完全匹配

时间:2017-02-06 04:33:15

标签: elasticsearch

我正在尝试将产品列表的标题与已知产品的数据库相匹配。我的第一个想法是将已知产品及其元数据放入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"
    }
  }
}

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

1 个答案:

答案 0 :(得分: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"
        }
      }
    }
  }
}