3

我在 ElasticSearch 索引中插入了 3 条记录,如下所示:

curl -XPOST 'http://127.0.0.1:9200/geoindex_test/STREET?pretty=1'  -d '
{ "cityNames" : [ { "language" : "ENG",
    "name" : "w bridgewater",
    "raw_name" : "W BRIDGEWATER"
  },
  { "language" : "ENG",
    "name" : "west bridgewater",
    "raw_name" : "West Bridgewater"
  }
],
"id" : 1,
  "streetNames" : [ { "language" : "ENG",
    "name" : "cram rd",
    "raw_name" : "Cram Rd"
  } ]
}'

curl -XPOST 'http://127.0.0.1:9200/geoindex_test/STREET?pretty=1'  -d '
{ "cityNames" : [ { "language" : "ENG",
    "name" : "bridgewater corners",
    "raw_name" : "BRIDGEWATER CORNERS"
  },
  { "language" : "ENG",
    "name" : "bridgewater center",
    "raw_name" : "Bridgewater Center"
  }
],
"id" : 2,
"streetNames" : [ { "language" : "ENG",
    "name" : "valley view rd",
    "raw_name" : "Valley View Rd"
  } ]
}'

curl -XPOST 'http://127.0.0.1:9200/geoindex_test/STREET?pretty=1'  -d '
{ "cityNames" : [ { "language" : "ENG",
    "name" : "bridgewater",
    "raw_name" : "Bridgewater"
  },
  { "language" : "ENG",
    "name" : "windsor",
    "raw_name" : "Windsor"
  }
],
"id" : 3,
"streetNames" : [ { "language" : "ENG",
    "name" : "valley view rd",
    "raw_name" : "Valley View Rd"
  } ]
}'

我执行如下搜索:

curl -XGET 'http://127.0.0.1:9200/geoindex_test/STREET/_search?pretty=1'  -d '
{
"query" : {
    "match" : { "cityNames.name" : "bridgewater" }
}
}'

我认为 ElasticSearch 将返回第三条记录(id == 3)作为最佳匹配(记录 3 是与“bridgewater”的唯一完全匹配),但它返回 id 1(w bridgewater)的记录作为最佳匹配。我究竟做错了什么?

4

1 回答 1

1

我想这是因为您正在使用内部对象,这些对象基本上将其下的对象折叠成一个以用于搜索目的。因此,例如,当您查询对象 1 的搜索字段时,您查询的是 ["w bridgewater", "west bridgewater"],而不是您可能想象的离散字段。

由于“bridgewater”在对象 1 和 2(两个名称字段)中出现两次,而在对象 3 中出现一次,因此这些项目在搜索中的排名更高。最终选择对象 1,因为出现“bridgewater”的字段比对象 2 中的字符串短(“w bridgewater”与“bridgewater corners”)。

不要像你正在做的那样使用内部对象,而是使用嵌套对象http://www.elasticsearch.org/guide/reference/mapping/nested-type/。将分数模式设置为“max”,然后会以更直观的方式为您匹配。

于 2013-05-23T07:21:20.903 回答