具有多个上下文的ElasticSearch 5.x上下文建议器

时间:2017-09-22 12:49:49

标签: elasticsearch

我想使用elasticSearch中的context suggester,但我的建议结果需要匹配2个上下文值。

从文档中扩展示例,我想做类似的事情:

POST place/_search?pretty
{
    "suggest": {
        "place_suggestion" : {
            "prefix" : "tim",
            "completion" : {
                "field" : "suggest",
                "size": 10,
                "contexts": {
                    "place_type": [ "cafe", "restaurants" ],
                    "rating": ["good"]
                }
            }
        }
    }
}

我希望结果具有背景' cafe'或者'餐厅'对于place_type和具有上下文' good'评级。

当我尝试这样的事情时,弹性对上下文执行OR操作,给我所有建议与上下文' cafe',restaurant'或者好的'。

我可以以某种方式指定BOOL操作符弹性需要用于组合多个上下文吗?

1 个答案:

答案 0 :(得分:1)

Elasticsearch 5.x以后似乎不支持此功能: https://github.com/elastic/elasticsearch/issues/21291#issuecomment-375690371

您最好的选择是创建一个composite context,这似乎是Elasticsearch 2.x如何在查询中实现多个上下文的方法: https://github.com/elastic/elasticsearch/pull/26407#issuecomment-326771608

为此,我想您需要在映射中添加一个新字段。我们称之为cat-rating

PUT place
{
  "mappings": {
    "properties": {
      "suggest": {
        "type": "completion",
        "contexts": [
          {
            "name": "place_type-rating",
            "type": "category",
            "path": "cat-rating"
          }
        ]
      }
    }
  }
}

索引新文档时,您需要将place_typerating字段合并在一起,用-隔开,cat-rating字段。 完成后,您的查询将需要如下所示:

POST place/_search?pretty
{
  "suggest": {
    "place_suggestion": {
      "prefix": "tim",
      "completion": {
        "field": "suggest",
        "size": 10,
        "contexts": {
          "place_type-rating": [
            {
              "context": "cafe-good"
            },
            {
              "context": "restaurant-good"
            }
          ]
        }
      }
    }
  }
}

这将返回有关咖啡馆或餐馆的建议。