【问题标题】:Elasticsearch [filtered] query does not support [suggest]Elasticsearch [过滤] 查询不支持 [建议]
【发布时间】:2016-09-11 16:28:52
【问题描述】:

我想让我们的用户通过文本和地理位置搜索对象。当通过文本搜索时,虽然我希望它像使用普通查询和完成建议一样建议术语。当我尝试将建议者添加到过滤后的查询中时,出现错误。有什么建议吗?

我的映射:

curl -XPUT http://localhost:9200/objects/object/_mapping -d '{
  "object": {
    "properties": {
      "objectDescription": {
        "type": "string"
      },
      "suggest": {
        "type": "completion",
        "analyzer": "standard",
        "search_analyzer": "standard",
        "payloads": true
      }
    }
  }
}'

curl -X PUT http://localhost:9200/objects/object/_mapping -d '{
    "object":{"properties":{"location":{"type":"geo_point"}}}
}'

我的搜索:

{
  "query": {
    "filtered": {
      "query": {
        "fuzzy": {
          "objectDescription": {
            "value": "burger"
          }
        }
      },
      "filter": {
        "or": [
          {
            "geo_distance": {
              "distance": "15mi",
              "location": {
                "lat": 33.4255104,
                "lon": -111.94000540000002
              }
            }
          },
          {
            "bool": {
              "must": [
                {
                  "term": {
                    "administrative_area_level_1": "AZ"
                  }
                },
                {
                  "term": {
                    "addressType": "administrative_area_level_1"
                  }
                }
              ]
            }
          }
        ]
      }
    }
  }
}

当我添加与查询相同级别的建议时,就像没有过滤器一样,它会忽略我的过滤器。它会在搜索时找到不靠近 lat lng 的对象。

{
    "query":{
        "filtered":{
            "query":{
                "fuzzy":{
                    "objectDescription":{"value":"bears"}
                }
            },
            "filter":{
                "bool":{
                    "should":[
                        {
                            "geo_distance":{
                                "distance":"15mi",
                                "location":{
                                    "lat":43.6187102,
                                    "lon":-116.21460680000001
                                }
                            }
                        },
                        {
                            "bool":{
                                "must":[
                                    {
                                        "term":{"administrative_area_level_1":"ID"}
                                },{
                                        "term":{"addressType":"administrative_area_level_1"}
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    },
    "suggest":{
        "object-suggest":{
            "text":"bears",
            "completion":{
                "field":"suggest",
                "fuzzy":{"fuzziness":2}
            }
        }
    }
}

当我将正文的建议部分代替查询时,我收到此错误。

{
    "query":{
        "filtered":{
            "suggest":{
                "object-suggest":{
                    "text":"bears",
                    "completion":{
                        "field":"suggest",
                        "fuzzy":{"fuzziness":2}
                    }
                }
            },
            "filter":{
                "bool":{
                    "should":[
                        {
                            "geo_distance":{
                                "distance":"15mi",
                                "location":{
                                    "lat":43.6187102,
                                    "lon":-116.21460680000001
                                }
                            }
                        },
                        {
                            "bool":{
                                "must":[
                                    {
                                        "term":{"administrative_area_level_1":"ID"}
                                },{
                                        "term":{"addressType":"administrative_area_level_1"}
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    }
}

所以我的问题是我没有在 elastic.co 或 stackoverflow 上找到一个将地理位置搜索与完成建议器相结合的示例。

【问题讨论】:

  • 您确定这是产生错误的查询,因为其中没有任何建议吗?
  • 嗨,瓦尔!很抱歉没有包括给出错误的实际正文,并感谢您清理我的代码 sn-ps。我在建议中包含了问题过滤器查询。我的目标是使用地理位置过滤器让搜索文本与建议者一起使用。感谢您的观看!

标签: elasticsearch filter geo


【解决方案1】:

试试这样。 suggest 块单独位于顶层:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [
            {
              "geo_distance": {
                "distance": "15mi",
                "location": {
                  "lat": 43.6187102,
                  "lon": -116.21460680000001
                }
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "term": {
                      "administrative_area_level_1": "ID"
                    }
                  },
                  {
                    "term": {
                      "addressType": "administrative_area_level_1"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  },
  "suggest": {
    "object-suggest": {
      "text": "bears",
      "completion": {
        "field": "suggest",
        "fuzzy": {
          "fuzziness": 2
        }
      }
    }
  }
}

更新

对于您的精确用例,我认为您应该使用带有地理位置上下文的context suggester,而不是简单的完成建议。这肯定是您实现预期目标所需要的。

【讨论】:

  • 因此,当我在顶层添加建议时,它似乎忽略了我的 geo_distance 过滤器。熊对象的纬度为 Tempe, AZ。当我在 AZ 坦佩 15 英里范围内搜索时,该对象被返回。当我在博伊西 15 英里范围内搜索时,仍然返回同一对象的 ID。当我不使用建议并且只使用 geo_distance 过滤器时,它会按预期工作。返回的对象是 Tempe lat lng 而不是 Boise lat lng。
  • 如果您绝对需要 geo_distance 过滤器,为什么要将它添加到 bool/should?应该在bool/must,对吧?
  • 我想返回所需 lat lng 的对象以及该 lat lng 的“父级”,在这种情况下是状态。所以给我这个 lat lng 15mi 范围内的所有对象,以及任何处于该状态且在该州没有特定位置的结果。这就是为什么它应该在里面。
  • 嗯,您可能需要使用context suggester(带有地理位置上下文)而不是简单的完成建议。
  • 好吧,有趣。我以前遇到过这个但忽略了它但再看一遍我认为你是对的。我认为实现我想要的唯一方法就是这样做。感谢您花时间看一看!我很感激:)
猜你喜欢
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多