gpt4 book ai didi

elasticsearch - Elastic Search查询嵌套父属性查询

转载 作者:行者123 更新时间:2023-12-03 00:47:32 25 4
gpt4 key购买 nike

我有一个 flex 文件,如下所示。

{
"process_id" : "123",
"user_info" : [{
"first_name":"A",
"last_name: "B"
}]
}

{
"process_id" : "123",
"user_info" : [{
"first_name":"C",
"last_name: "B"
},
{"first_name" : "A",
"last_name":"D"
} ]
}

方案1:

我尚未将嵌套类型设置为“user_info”字段。
我将“process_id”搜索为123,将first_name搜索为A,将last_name搜索为
B,我得到了结果中的两个文件。

方案2:

搜索返回错误。看来我将无法搜索嵌套项和父项中的项。

查询如下:
{


"query": {
"query_string": {
"query": "process_id:123",
"nested": {
"path": "user_info",
"query": {
"query_string": {
"query": "(user_info.first_name:A AND user_info.last_name:B"
}
}
}
} } }

错误响应如下。
{
"error": {
"root_cause": [
{
"type": "parsing_exception",
"reason": "[query_string] unknown token [START_OBJECT] after [nested]",
"line": 1
}
],
"type": "parsing_exception",
"reason": "[query_string] unknown token [START_OBJECT] after [nested]",
"line": 1,

},
"status": 400
}

理想的响应应该是当我搜索process_id为123,first_name为A和last_name为B时,只需要返回第一个文档。

注意:属性名称的用途是通用的,以便可以显示实际名称。

最佳答案

我可以在方案2中看到以下2个问题

  • 组合查询,您需要使用bool -query
  • 为了使nested-查询正常工作,您需要将“父”字段定义为nested -field

  • 1.在映射中声明字段user_infonested类型:
    PUT processes
    {
    "mappings": {
    "properties": {
    "process_id": {
    "type": "keyword"
    },
    "user_info": {
    "type": "nested",
    "properties": {
    "first_name": {
    "type": "text",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    },
    "last_name": {
    "type": "text",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    }
    }
    }
    }
    }
    }

    注意:带有额外行 user_info"type": "nested"的映射

    2.索引您提供的2个示例文档
    POST processes/_bulk
    {"index":{"_id":1}}
    {"process_id": "123", "user_info": [{"first_name": "A", "last_name": "B"}]}
    {"index":{"_id":2}}
    {"process_id": "123", "user_info": [{"first_name": "C", "last_name": "B"},{"first_name": "A", "last_name": "D"}]}

    3.使用first_name -query 来查询 last_namenested的组合
    GET processes/_search
    {
    "query": {
    "bool": {
    "must": [
    {
    "term": {
    "process_id": {
    "value": "123"
    }
    }
    },
    {
    "nested": {
    "path": "user_info",
    "query": {
    "bool": {
    "must": [
    {
    "match": {
    "user_info.first_name": "A"
    }
    },
    {
    "match": {
    "user_info.last_name": "B"
    }
    }
    ]
    }
    }
    }
    }
    ]
    }
    }
    }

    注意: search_request为一个特定用户(而不是跨用户)搜索与process_id(123)以及 user_info.first_nameuser_info.last_name组合匹配的所有文档。在上述设置中,查询仅匹配文档1。
    如果您希望Elasticsearch还告诉您是哪个user_info导致了匹配(如果一个进程有多个user_info对象),则可以在嵌套查询中添加以下子句: "inner_hits": {}

    您可能想知道为什么我已将字段 process_id映射到 keyword -field。这是最佳实践,因为 keyword是存储ID的最有效类型。

    Elasticsearch文档中的引用: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html

    更新2019年10月13日:使用 queryString -query添加了版本
    GET processes/_search
    {
    "query": {
    "bool": {
    "must": [
    {
    "query_string": {
    "query": "process_id:123"
    }
    },
    {
    "nested": {
    "path": "user_info",
    "query": {
    "query_string": {
    "query": "user_info.first_name:A AND user_info.last_name:B"
    }
    }
    }
    }
    ]
    }
    }
    }

    关于elasticsearch - Elastic Search查询嵌套父属性查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58342445/

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