需要Elasticsearch的帮助。我尝试获得第一个完全匹配结果,然后使用以下查询匹配一个字段但没有运气的文档。基本上,尝试首先获得最高分,然后不太准确,并且只匹配总搜索结果中的一个字段。
映射如下:
{
"palsx1493": {
"mappings": {
"pals": {
"properties": {
"aboutme": {
"type": "string"
},
"dob": {
"type": "date",
"format": "date"
},
"fccode": {
"type": "string"
},
"fcname": {
"type": "string"
},
"learning": {
"type": "nested",
"properties": {
"skillslevel": {
"type": "string"
},
"skillsname": {
"type": "string"
}
}
},
"name": {
"type": "string"
},
"rating": {
"type": "string"
},
"teaching": {
"type": "nested",
"properties": {
"skillslevel": {
"type": "string"
},
"skillsname": {
"type": "string"
}
}
},
"trate": {
"type": "string"
},
"treg": {
"type": "string"
}
}
}
}
} }
在搜索时,我需要结果返回完全匹配的文档,然后返回与优先顺序中的教学技能名称匹配的较低分数。现在发生的事情是我首先正确获得完全匹配,然后我将learning.skillname匹配,然后与teaching.skillname匹配。我希望这两个最后一个交换后,在完全匹配的结果之后显示teaching.skillname。
完全匹配: 1. fcname(是国家/地区名称,可以是特定名称,也可以设置为“任意国家/地区”)。 2. dob:出生日期是范围值 - 范围值作为输入 3.教学:技能 4.学习:技能名称
这就是我没有运气的尝试:
{
"query": {
"bool": {
"should": [
{ "match": { "fcname": "spain"}},
{ "range": {
"bod": {
"from": "1950-10-10",
"to": "1967-12-12"
}
}
},
{
"nested": {
"path": "learning",
"score_mode": "max",
"query": {
"bool": {
"must": [
{ "match": { "learning.skillname": learningSkillName}}
]
}
}
}
},
{
"nested": {
"path": "teaching",
"query": {
"bool": {
"must": [
{ "match": { "teaching.skillname": teachingSkillName}}
]
}
}
}
}
]
}
}
}
答案 0 :(得分:1)
请查看指数。默认为全文搜索,它使用反向索引来存储数据。所以它会根据分析仪存储字符串。
精确的字符串匹配请使用:index ='not_analyzed'
例如。
“切口”{ “type”:“string”, “指数”: “not_analyzed” },
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-core-types.html
答案 1 :(得分:0)
我明白了。解决方案是使用function_score功能覆盖/添加具有特定匹配字段的文档的分数。用以下代替上面的嵌套部分给了我正确的结果:
"nested": {
"path": "teaching",
"query": {
"function_score": {
"query": {
"bool": {
"must": [
{ "match": { "teaching.skillname": "xxx"}}
]
}
},
"functions": [
{
"script_score": {
"script": "_score + 2"
}
}],