Elasticsearch:搜索分数困扰我。不同比赛级别的分数相同

时间:2019-03-11 15:49:21

标签: elasticsearch kibana

为了简化:

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"
        }
      }
    ]
  }
}

是否有一种方法可以在发现较少的搜索关键字时强制其得分较低?另外,如果我对这种搜索的方式走错了方向,并且有更好的模式/方法可以实现,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

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

首先,您应该将works_at定义为嵌套映射(更多信息here)。然后,您必须调整查询以使用该嵌套映射,请参见示例here

答案 1 :(得分:-1)

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"
        }
      }
    ]
  }
}