如何让弹性搜索返回完全匹配,然后返回结果中的其他匹配

时间:2015-07-20 12:15:28

标签: elasticsearch

需要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}}
            ]
            }
        }
      }
    }
  ]
 }
}
}

2 个答案:

答案 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"
            }
          }],