gpt4 book ai didi

elasticsearch - ElasticSearch:在属性和嵌套对象上使用query_string的多字段查询

转载 作者:行者123 更新时间:2023-12-03 01:37:30 29 4
gpt4 key购买 nike

我正在尝试解决以下高级要求:

  • 在已经具有属性的文档上保存任意数量的键值对:名称和描述
  • 值可以是应在“范围可搜索”范围内的数字
  • 值可以包含geo_points,它们必须是“可地理搜索的”

  • 我创建了以下索引。
    {
    "settings": {
    "index" : {
    "number_of_shards" : 3,
    "number_of_replicas" : 1
    }
    },
    "mappings": {
    "_doc": {
    "dynamic": "strict",
    "properties": {
    "name": {
    "type": "text",
    "analyzer": "german",
    },
    "description": {
    "type": "text",
    "analyzer": "german"
    },
    "attributes": {
    "type": "nested",
    "properties": {
    "key": { "type": "text" },
    "val_bool": { "type": "boolean" },
    "val_int": { "type": "integer" },
    "val_float": { "type": "float" },
    "val_string": { "type": "text" },
    "val_geo": { "type": "geo_point" },
    "val_date": { "type": "date" }
    }
    }
    }
    }
    }
    }

    我们使用嵌套对象来保存每个文档的键值对列表。每个键值对使用一个类型化的val_ *属性来保留该类型化的值。这样就可以对特殊类型进行特殊搜索,例如范围查询。

    为了搜索文档,我们使用query_string查询来允许用户在搜索中非常具体。例如。搜索名称为:foo和描述为:bar的文档。 (按预期工作)

    键值对应该有相同的情况,例如:
    attribute.key:someKey和attribute.val_string:someStringValue。
    这种情况下需要我们使用并按预期工作的嵌套查询。

    不起作用:
    如果我们搜索name:foo和attribute.key:someKey,则不会得到任何结果。

    似乎并没有同时支持“嵌套的query_string查询”和“只是query_string查询”。真的吗?
    有什么可行的解决方案可以实现上述要求?

    查询如下所示:
    {
    "query": {
    "bool": {
    "should": [
    {
    "query_string": {
    "query": "attributes.key:someKey AND name:foo",
    "default_operator": "and",
    "fields": [
    "name",
    "description"
    ]
    }
    },
    {
    "nested": {
    "query": {
    "query_string": {
    "query": "attributes.key:someKey AND name:foo",
    "default_operator": "and",
    "fields": [
    "attributes.key",
    "attributes.val_string"
    ]
    }
    },
    "path": "attributes"
    }
    }
    ]
    }
    }
    }

    任何帮助是极大的赞赏。先感谢您。

    最佳答案

    嵌套对象被索引为单独的文档。也就是说,您正在有效地查询两个文档,但是它们都不符合给定的查询:

    _doc没有(未嵌套)字段属性,并且属性不包含字段名称。由于查询中的两个字词都与AND进行逻辑链接,因此搜索结果为零命中。

    尝试检索所有包含两个带有指定键之一的嵌套对象的根父文档时,类似attributes.key:someKey AND attributes.key:otherKey的查询字符串也会出现类似的问题。由于两个嵌套对象彼此独立,因此此查询正在查找具有两个键的嵌套对象-但每个对象只能有一个。

    若要解决此问题,您必须以某种方式将查询分为与根父文档和嵌套对象有关的部分。之后,您必须为每个引用嵌套对象的术语创建一个嵌套查询。换句话说,name:foo AND attributes.key:someKey最终必须看起来像这样:

    {
    "query": {
    "bool": {
    "must": [
    {
    "query_string": {
    "query": "name:foo"
    }
    },
    {
    "nested": {
    "query": {
    "query_string": {
    "query": "attributes.key:someKey"
    }
    },
    "path": "attributes"
    }
    }
    ]
    }
    }
    }

    一种可能的解决方案是提供多个输入,一个用于查询根父文档本身,另一个用于查询嵌套对象。然后,您可以通过手动创建由嵌套部分和未嵌套部分组成的查询来组合两个查询字符串。

    或者,您可以考虑自己解析查询,每次遇到attribute。[field]时都会生成一个嵌套查询。

    关于elasticsearch - ElasticSearch:在属性和嵌套对象上使用query_string的多字段查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51260521/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com