【问题标题】:Elasticsearch search query with nested fields带有嵌套字段的 Elasticsearch 搜索查询
【发布时间】:2019-03-23 04:03:35
【问题描述】:

我正在使用 elasticsearch 上的简历数据库。有嵌套字段。例如,有一个“技能”部分。 “skills”是一个包含“skill”和“years”的嵌套字段。我希望能够进行查询以返回特定年份的技能。例如,我想获得具有 3 年或以上“python”经验的人的简历。

我已成功运行执行以下操作的查询:

它返回所有具有“python作为skills.skill和3作为skills.year”的简历 这将返回 python 与 2 年或经验相关联的结果,只要某些其他领域与 3 年经验相关联。

GET /resumes/_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "skills.skill":   "python" }}, 
        { "match": { "skills.years": 3 }}  
      ]
    }
  }
}

有没有更好的方法来对 3 与 python 更相关的数据进行排序?

【问题讨论】:

    标签: elasticsearch elasticsearch-6


    【解决方案1】:

    你需要使用Nested DataType,对应的你需要使用Nested Query

    您在当前模型中拥有的似乎是basic object model

    我在下面提到了示例映射、示例文档、嵌套查询和响应。这将为您提供所需的内容。

    映射

    PUT resumes
    {
      "mappings": {
        "mydocs": {
          "properties": {
            "skills": {
              "type": "nested",
              "properties": {
                "skill": {
                  "type": "keyword"
                },
                "years": {
                  "type": "integer"
                }
    
              }
            }
          }
        }
      }
    }
    

    示例文件:

    POST resumes/mydocs/1
    {
      "skills": [
        {
          "skill": "python",
          "years": 3
        },
        {
          "skill": "java",
          "years": 3
        }
        ]
    }
    
    POST resumes/mydocs/2
    {
      "skills": [
        {
          "skill": "python",
          "years": 2
        },
        {
          "skill": "java",
          "years": 3
        }
        ]
    }
    

    查询

    POST resumes/_search
    {
      "query": {
        "nested": {
          "path": "skills",
          "query": {
            "bool": {
              "must": [
                {
                  "match": {
                    "skills.skill": "python"
                  }
                },
                {
                  "match": {
                    "skills.years": 3
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    查询响应:

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 1.6931472,
        "hits": [
          {
            "_index": "resumes",
            "_type": "mydocs",
            "_id": "1",
            "_score": 1.6931472,
            "_source": {
              "skills": [
                {
                  "skill": "python",
                  "years": 3
                },
                {
                  "skill": "java",
                  "years": 3
                }
              ]
            }
          }
        ]
      }
    }
    

    请注意,您仅在上述响应中检索 id 为 1 的文档。另请注意,为了简单起见,我将 Skills.skill 设为 keyword 类型。您可以根据您的用例将其更改为 text

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2020-02-15
      相关资源
      最近更新 更多