Elasticsearch:搜索分数让我困惑。不同比赛级别得分相同

Elasticsearch: search score puzzle me. Same score for different match levels

简化:

PUT /test/vendors/1
{
  "type": "doctor",
  "name": "Ron",
  "place": "Boston"  
}

PUT /test/vendors/2
{
  "type": "doctor",
  "name": "Tom",
  "place": "Boston"  

}

PUT /test/vendors/3
{
  "type": "doctor",
  "name": "Jack",
  "place": "San Fran"  

}

然后搜索:

GET /test/_search
{
  "query": {
    "multi_match" : {
      "query":    "doctor in Boston", 
      "fields": [ "type", "place" ] 
    }
  }
}

我明白为什么我会找到在旧金山工作的 Jack -- 因为他也是 doctor。但是,我不明白为什么比赛得分对他来说是一样的。其他两个也与 place 匹配,不是吗?为什么 RonTom 得分不高?

{
  "took": 11,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0.9245277,
    "hits": [
      {
        "_index": "test",
        "_type": "vendors",
        "_id": "2",
        "_score": 0.9245277,
        "_source": {
          "type": "doctor",
          "name": "Tom",
          "place": "Boston"
        }
      },
      {
        "_index": "test",
        "_type": "vendors",
        "_id": "1",
        "_score": 0.9245277,
        "_source": {
          "type": "doctor",
          "name": "Ron",
          "place": "Boston"
        }
      },
      {
        "_index": "test",
        "_type": "vendors",
        "_id": "3",
        "_score": 0.9245277,
        "_source": {
          "type": "doctor",
          "name": "Jack",
          "place": "San Fran"
        }
      }
    ]
  }
}

有没有办法在搜索到的关键词少的时候强制降低得分?另外,如果我对这种搜索有误,并且有更好的方法 pattern/way 来做——我很乐意被指出正确的方向。

您的搜索结构不正确。上面的搜索查询忽略了 place 属性,这就是为什么所有文档得到相同分数的原因(仅考虑 type 属性)。之所以这样是因为works_at是一个嵌套映射,在查找的时候要区别对待。

首先,您应该将 works_at 定义为嵌套映射(阅读更多 here). Then you'll have to adjust your query to work with that nested mapping, see an example here

GET /test/_search
{
  "query": {
    "multi_match" : {
      "query":    "doctor in Boston", 
      "fields": [ "type", "place" ],
      "type": "most_fields" .   <---- I WAS MISSING THIS
    }
  }
}

进入后,给出了正确的结果,"San Fran" 人的得分较低。

{
  "took": 8,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1.2122098,
    "hits": [
      {
        "_index": "test",
        "_type": "vendors",
        "_id": "2",
        "_score": 1.2122098,
        "_source": {
          "type": "doctor",
          "name": "Tom",
          "place": "Boston"
        }
      },
      {
        "_index": "test",
        "_type": "vendors",
        "_id": "1",
        "_score": 1.2122098,
        "_source": {
          "type": "doctor",
          "name": "Ron",
          "place": "Boston"
        }
      },
      {
        "_index": "test",
        "_type": "vendors",
        "_id": "3",
        "_score": 0.9245277,
        "_source": {
          "type": "doctor",
          "name": "Jack",
          "place": "San Fran"
        }
      }
    ]
  }
}