我正在做elasticsearch上的简历数据库。有嵌套的字段。例如,有一个“技能”部分。"skills“是一个嵌套的字段,包含”skills“和"years”。我希望能够执行一个查询,返回某个年份的技能。例如,我想要获得具有3年或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 }}
]
}
}
}有没有一种更好的方法来对与python关联更多的数据进行排序?
发布于 2019-03-23 04:03:35
您需要使用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。
希望能有所帮助!
https://stackoverflow.com/questions/55306883
复制相似问题